Python 3.x 无效指针崩溃
我试图使用Cython包装一个C库,但尝试将bytes对象传递给函数时失败 我的Python如下所示:Python 3.x 无效指针崩溃,python-3.x,memory-management,cython,Python 3.x,Memory Management,Cython,我试图使用Cython包装一个C库,但尝试将bytes对象传递给函数时失败 我的Python如下所示: def tou8(s): return s.encode('utf-8') cdef char **alloc_strarr(in_arr, blen=0): size = len(in_arr) cdef char **out_arr = <char **>calloc(size, sizeof(char *)) cdef char *tempb
def tou8(s):
return s.encode('utf-8')
cdef char **alloc_strarr(in_arr, blen=0):
size = len(in_arr)
cdef char **out_arr = <char **>calloc(size, sizeof(char *))
cdef char *tempb
if out_arr is NULL:
raise MemoryError()
fail = 0
for i in range(0, size):
b = tou8(in_arr[i])
if blen:
out_arr[i] = <char *>calloc(blen, sizeof(char))
if out_arr[i] is NULL:
fail = i
break
tempb = b
rc = snprintf(out_arr[i], blen, b'%s', tempb)
if rc >= blen:
fail = i
break
else:
out_arr[i] = b
if fail:
for i in range(0, fail):
free(out_arr[i])
free(out_arr)
raise MemoryError()
return out_arr
# this function inside a larger cdef class
def __cinit__(self, fieldc, fieldnames, primkey=''):
cdef char **cfields = alloc_strarr(fieldnames, blen=FMAXLEN)
cprimkey = tou8(primkey)
self._list = so.cq_new_dlist(fieldc, cfields, cprimkey)
free_all(cfields, len(fieldnames))
if self._list is NULL:
raise Exception('Memory or value error creating DataList')
我的初始化过程出了什么问题?当您写入
out\u arr[i]=b
时,存储在out\u arr[i]
中的指针指向b
合并的内存,并且只有b
指向的对象未被垃圾收集(例如在下一次迭代中)时才有效 一个完整的、可重复的答案会很有帮助。您还可以考虑添加一些打印语句来查看其确切位置。
$ python3
Python 3.4.2 (default, Dec 27 2014, 13:16:08)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymodule
>>> dl = mymodule.MyClass(1, ['test'])
*** Error in `python3': munmap_chunk(): invalid pointer: 0x00007fa4b6a17320 ***
Aborted