Cython realloc错误:释放对象的校验和不正确

2024-10-04 03:18:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用了一段时间了,没有任何问题。我在项目的大多数模块中广泛使用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进一步初始化


Tags: 模块对象函数selfnullptscdefptr
2条回答

这并不明显,但我的见解是python或system(这里是OSX)保留了一个指针变量分配表,因此在调用“free”方法之后,有必要通过显式地将其值设置为NULL来清除指针变量。在

示例:


    free(pointer)
    pointer = NULL

这并不明显,因为这篇文章并没有提到在“C”中释放内存的正确方法: Best way to release memory allocated using malloc

我希望这对其他人有帮助。 非常感谢投反对票!在

前面提供的所有答案都很好,但是我发现,任何内存分配问题的最终解决方案都是使用DMALLOC之类的内存分配拦截器。DMOALC是调试内存分配库,可以添加到任何C/C++项目中。它拦截对标准函数malloc、free、calloc等的任何调用,并允许对未刷新内存指针进行详细跟踪。这种方法可以很快地识别出分割错误。 DMALLOC可在DMALLOC.COM获得。在

另外,一个较小的解决方案是使用ADB。ADB及其backtrace命令可以帮助缩小导致问题的代码部分。它不如dmalloc精确,但不需要额外的库与项目耦合。在

相关问题 更多 >