Cython扩展类:"incorrect checksum for freed object"后__dealloc__方法

Cython extension class: "incorrect checksum for freed object" after __dealloc__ method

本文关键字:object freed dealloc 方法 checksum 扩展 incorrect Cython for      更新时间:2023-10-16

OK,在使用Cython的c++支持后,我得到了一个奇怪的错误,因为我认为手册建议(使用__cinit__分配堆RAM和__dealloc__再次释放它)。

我有一个c++类,callocmalloc在其构造函数中使用一些RAM, free在析构函数中使用一些RAM。如果有必要,我会发布这个,但错误不是来自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手册的要求整理完之后就会发脾气

我还尝试在__dealloc__中设置self.adj = NULL,以防Python试图查看我的对象内部,但这没有帮助。

你知道我做错了什么吗?

我在c++代码中犯了一个错误(我没有显示)。

我有一堆这样的函数:
if (_meta != NULL) {
  // do stuff with _meta, like loop over the void*s
}

但是在构造函数中,我在设置_meta = NULL;之前调用了其中一个…

相关文章: