確定「不正確的校驗和釋放對象」,使用用Cython的C++的支持後,我得到一個奇怪的錯誤,因爲我覺得manual advises(使用__cinit__
分配堆內存和__dealloc__
再次釋放它。用Cython擴展類:後__dealloc__方法
我有一個C++類calloc
和malloc
小號一些RAM在其構造和free
的IT在析構函數。如果有必要,我會張貼此,但錯誤不是從C++來到,和new
和delete
電話做工精細,所以我只給你的用Cython現在:
cdef extern from "../clibs/adjacency.hpp":
cdef cppclass Adjacency:
int* _bv
void** _meta
unsigned int length
Adjacency(int graph_order, int meta_on)
int get(int i, int j)
void set(int i, int j, int on, void* meta)
void reset_to_zero()
void edges_iter(void* global_meta, void (*callback)(void*, int, int, void*))
cdef class Graph:
cdef Adjacency* adj
def __init__(self, graph_order):
print "__init__"
def __cinit__(self, graph_order, *args, **kwargs):
print "__cinit__"
print "allocating, no meta."
self.adj = new Adjacency(<int>graph_order, 0)
def __dealloc__(self):
print "__dealloc__"
del self.adj
當我測試,我得到以下幾點:
In [1]: import graph
In [2]: g = graph.Graph(302)
__cinit__
allocating, no meta.
__init__
In [3]: ^D
Do you really want to exit ([y]/n)?
__dealloc__
Python(7389,0x7fff70f9acc0) malloc: *** error for object 0x100defa08: incorrect
checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap
我有時也得到了段錯誤,而不是一個不正確的校驗和。
我破解打開用Cython生成的C++文件,並添加周圍的delete
調用以下:
/* "graph.pyx":75
* def __dealloc__(self):
* print "__dealloc__"
* del self.adj # <<<<<<<<<<<<<<
*
* def __init__(self, graph_order):
*/
printf("about to delete adj:\n");
delete __pyx_v_self->adj;
printf("just deleted adj!\n");
,我們可以清楚地看到,在呼叫我到delete
運行得細緻:
In [1]: import graph
In [2]: g = graph.Graph(302)
__cinit__
allocating, no meta.
__init__
In [3]: ^D
Do you really want to exit ([y]/n)?
__dealloc__
about to delete adj:
just deleted adj!
Python(7389,0x7fff70f9acc0) malloc: *** error for object 0x100defa08: incorrect
checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap
而且Python在之後會引起發脾氣我已經完成整理,正如我在Cython手冊中所告訴的那樣。
我也試過設置self.adj = NULL
在__dealloc__
,以防Python試圖在我的對象內部看到,但沒有幫助。
任何想法我做錯了什麼?