Cython扩展类:"incorrect checksum for freed object"后__dealloc__方法
Cython extension class: "incorrect checksum for freed object" after __dealloc__ method
OK,在使用Cython的c++支持后,我得到了一个奇怪的错误,因为我认为手册建议(使用__cinit__
分配堆RAM和__dealloc__
再次释放它)。
我有一个c++类,calloc
和malloc
在其构造函数中使用一些RAM, free
在析构函数中使用一些RAM。如果有必要,我会发布这个,但错误不是来自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手册的要求整理完之后就会发脾气。
我还尝试在__dealloc__
中设置self.adj = NULL
,以防Python试图查看我的对象内部,但这没有帮助。
你知道我做错了什么吗?
我在c++代码中犯了一个错误(我没有显示)。
我有一堆这样的函数:if (_meta != NULL) {
// do stuff with _meta, like loop over the void*s
}
但是在构造函数中,我在设置_meta = NULL;
之前调用了其中一个…
相关文章:
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- 删除分配的 (?) 指针时"Pointer being freed was not allocated"
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- WebKit2GTK+ "window-object-cleared"未清除
- C++编译错误,"malloc: *** error for object: pointer being freed was not allocated"
- 解析 csv 文件,"malloc: *** error for object 0x7ffeeb4f4b80: pointer being freed was not allocated"出现此错误
- 库析构函数中的"Incorrect checksum for freed object"
- Cython扩展类:"incorrect checksum for freed object"后__dealloc__方法