我已经用了一段时间了,没有任何问题。我在项目的大多数模块中广泛使用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。 顺便说一句:我在MacBookPro(8GB内存)上运行这个程序
我做错什么了?在
注意: 变量“_faceList”在代码中使用512个struct MeshFace单元上的malloc进一步初始化
这并不明显,但我的见解是python或system(这里是OSX)保留了一个指针变量分配表,因此在调用“free”方法之后,有必要通过显式地将其值设置为NULL来清除指针变量。在
示例:
这并不明显,因为这篇文章并没有提到在“C”中释放内存的正确方法: Best way to release memory allocated using malloc
我希望这对其他人有帮助。 非常感谢投反对票!在
前面提供的所有答案都很好,但是我发现,任何内存分配问题的最终解决方案都是使用DMALLOC之类的内存分配拦截器。DMOALC是调试内存分配库,可以添加到任何C/C++项目中。它拦截对标准函数malloc、free、calloc等的任何调用,并允许对未刷新内存指针进行详细跟踪。这种方法可以很快地识别出分割错误。 DMALLOC可在DMALLOC.COM获得。在
另外,一个较小的解决方案是使用ADB。ADB及其backtrace命令可以帮助缩小导致问题的代码部分。它不如dmalloc精确,但不需要额外的库与项目耦合。在
相关问题 更多 >
编程相关推荐