2013-01-01 126 views
1

確定「不正確的校驗和釋放對象」,使用用Cython的C++的支持後,我得到一個奇怪的錯誤,因爲我覺得manual advises(使用__cinit__分配堆內存和__dealloc__再次釋放它。用Cython擴展類:後__dealloc__方法

我有一個C++類callocmalloc小號一些RAM在其構造和free的IT在析構函數。如果有必要,我會張貼此,但錯誤不是從C++來到,和newdelete電話做工精細,所以我只給你的用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試圖在我的對象內部看到,但沒有幫助。

任何想法我做錯了什麼?

回答

0

我在我的C++代碼中犯了一個錯誤(我沒有顯示)。

我有這樣一組函數:

if (_meta != NULL) { 
    // do stuff with _meta, like loop over the void*s 
} 

但在構造函數中,我打電話的這些人之前設置_meta = NULL; ...