我使用cython已经有一段时间了,没有任何问题。我在项目的大多数模块中都广泛使用了malloc函数,但是在这个特定的模块中,realloc以一种奇怪的方式使我失败了。这是错误的功能:
cdef MeshFace* addFace(self, cVector* p1, cVector* p2, cVector* p3, cVector* normal): cdef cVector* pts[3] cdef MeshFace* f = NULL cdef void* ptr = NULL pts[0] = p1 pts[1] = p2 pts[2] = p3 if(self._facenum >= self._facemem - 2): self._facemem = <int>(<double>self._facemem*1.25) ptr = realloc(self._faceList, self._facemem*sizeof(MeshFace)) if ptr == NULL: return NULL self._faceList = ptr f = &self._faceList[self._facenum] MFace_init2(f, &pts[0], 3, NULL) self._facenum += 1
该函数被多次调用以将面添加到网格中。然而,当“ facenum”值达到600左右时,python会引发内存错误:对象0x100bef800错误:释放的对象的校验和不正确-对象在释放后可能已被修改。
我在其他地方确实使用了malloc,没有任何问题。 顺便说一句:我在MacBook Pro(8GB RAM)上运行该程序
我在做什么错了?
注意: 在代码中使用结构MeshFace的512单元上的malloc在代码中进一步初始化变量“ _faceList”
答案 0 :(得分:0)
这不是很明显,但是我的见解是python或系统(这里是OSX)保留分配的指针变量表,因此在调用“ free”方法后,有必要通过以下方式清除指针变量:明确将其值设置为NULL。
示例:
free(pointer) pointer = NULL
这不是很明显,因为在这篇文章中没有提到释放“ C”中内存的正确方法: Best way to release memory allocated using malloc
我希望这对其他人有帮助。 非常感谢您的不赞成票!
答案 1 :(得分:0)
以前提供的所有答案都是好的,但是我发现,对于任何内存分配问题,最终的解决方案是使用内存分配拦截器,例如DMALLOC。 DMALLOC是调试内存分配库,可以将其添加到任何C / C ++项目中。它拦截对标准函数malloc,free,calloc等的任何调用,并允许对未释放的内存指针进行详细的跟踪。这样,可以非常快速地识别出细分错误。 DMALLOC可从DMALLOC.COM获得。
还有一个较小的解决方案是使用ADB。 ADB及其backtrace命令可以帮助缩小导致问题的代码部分。它不如dmalloc精确,但不需要额外的库即可与项目耦合。