Cython重新分配错误:释放的对象的校验和不正确

时间:2018-07-26 13:18:24

标签: python malloc cython

我使用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”

2 个答案:

答案 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精确,但不需要额外的库即可与项目耦合。