diff options
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/ctypeslib.py | 2 | ||||
-rw-r--r-- | numpy/tests/test_ctypeslib.py | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/numpy/ctypeslib.py b/numpy/ctypeslib.py index 9d7173d0f..2e9781286 100644 --- a/numpy/ctypeslib.py +++ b/numpy/ctypeslib.py @@ -401,5 +401,5 @@ if ctypes is not None: raise TypeError("readonly arrays unsupported") tp = _ctype_ndarray(_typecodes[ai["typestr"]], ai["shape"]) result = tp.from_address(addr) - result.__keep = ai + result.__keep = obj return result diff --git a/numpy/tests/test_ctypeslib.py b/numpy/tests/test_ctypeslib.py index 53b75db07..d389b37a8 100644 --- a/numpy/tests/test_ctypeslib.py +++ b/numpy/tests/test_ctypeslib.py @@ -2,6 +2,7 @@ from __future__ import division, absolute_import, print_function import sys import pytest +import weakref import numpy as np from numpy.ctypeslib import ndpointer, load_library, as_array @@ -260,3 +261,15 @@ class TestAsArray(object): b = np.ctypeslib.as_array(newpnt, (N,)) # now delete both, which should cleanup both objects del newpnt, b + + def test_segmentation_fault(self): + arr = np.zeros((224, 224, 3)) + c_arr = np.ctypeslib.as_ctypes(arr) + arr_ref = weakref.ref(arr) + del arr + + # check the reference wasn't cleaned up + assert_(arr_ref() is not None) + + # check we avoid the segfault + c_arr[0][0][0] |