Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython realloc错误:已释放对象的校验和不正确_Python_Malloc_Cython - Fatal编程技术网

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

Python Cython realloc错误:已释放对象的校验和不正确,python,malloc,cython,Python,Malloc,Cython,我已经使用cython一段时间了,没有任何问题。我在项目的大多数模块中都广泛使用了malloc函数,但在这个特定模块中,realloc以一种奇怪的方式使我失败。以下是故障功能: cdef MeshFace* addFace(self, cVector* p1, cVector* p2, cVector* p3, cVector* normal): cdef cVector* pts[3] cdef MeshFace*

我已经使用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 cdef网格面*添加面(自身、cVector*p1、cVector*p2、, cVector*p3,cVector*正常): cdef cVector*pts[3] cdef MeshFace*f=NULL cdef void*ptr=NULL pts[0]=p1 pts[1]=p2 pts[2]=p3 如果(self.\u facenum>=self.\u facemem-2): self.\u facemem=(self.\u facemem*1.25) ptr=realloc(自我), self._facemem*sizeof(MeshFace)) 如果ptr==NULL: 小风一吹 self.\u faceList=ptr f=&self.\u faceList[self.\u facenum] MFace_init2(f,&pts[0],3,NULL) self._facenum+=1 此函数将被多次调用以向网格添加面。然而,当“facenum”值达到600左右时,python会引发一个内存错误:对象0x100bef800的错误:已释放对象的校验和不正确-对象可能在被释放后被修改

其他地方我使用malloc没有任何问题。 顺便说一句:我在MacBookPro(8GB内存)上运行这个程序

我做错了什么

注意:
变量“_faceList”在代码中使用struct MeshFace的512单元上的malloc进行了进一步初始化,这并不明显,但我的见解是python或系统(这里是OSX)某种程度上保留了一个分配指针变量的表,因此在调用“free”方法之后,有必要通过将指针变量的值显式设置为NULL来清除指针变量

例如:

free(pointer) pointer = NULL 自由(指针) 指针=空 这并不明显,因为这篇文章中没有提到释放“C”中内存的正确方法:

我希望这对其他人有帮助。
非常感谢你的否决票

前面提供的所有答案都是好的,但我发现,任何内存分配问题的最终解决方案都是使用内存分配拦截器,如DMALLOC。DMALLOC是调试内存分配库,可以添加到任何C/C++项目中。它拦截对标准函数malloc、free、calloc等的任何调用,并允许详细跟踪未绑定的内存指针。这样可以非常快速地识别分割错误。 DMALLOC可从以下网址获得:


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

这缺少一个-除了您之外,任何人都无法测试它。然而,我怀疑self的缩进。我已经纠正了缩进问题。是啊,这个项目相当大。我就是不能把它贴在这里。问题很可能出在别处。您将使用该内存执行某些操作(例如,意外修改它/通过悬空指针释放它)。realloc是检测问题的位置,但不太可能是原始位置。指针“\u faceList”从未在任何地方修改过,与返回值“f”相同,iis仅读取该值进行渲染。我想这与另一个指向不同内存地址的指针有关。这怎么可能呢?您可以在数组末尾以外的位置写入
\u faceList
所在的位置。您可以分配一些内容,释放一些内容,不清除指针,然后当重新分配
\u faceList
时,它可能会以与您以前使用的指针相同的地址结束。在释放指针后,将指针设置为NULL通常是一个好主意,因为这会阻止您再次意外使用它们。不过这是没有必要的。