我正在为游戏中的几个对象使用OpenCV 2的cv :: Mat结构。有时这些是直接传递的,有时是由cv::Mat*
指针传递的,例如当一个对象需要修改另一个对象的cv :: Mat时。我习惯于自己管理内存,但我知道cv :: Mat使用引用计数。一切似乎都在大部分时间都有效,但偶尔我会在Xcode的调试模式下运行以下错误:
malloc: *** error for object 0x3000000000000000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
当我将两个cv :: Mats传递给一个函数时会发生这种情况,如下所示:
Find(this->fillShape, shape->fillShape)
每次我遇到这条线时都不会发生此错误。我该怎么调试呢?
答案 0 :(得分:0)
从第7.20.3.2节开始,C99标准的自由功能:
The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by the calloc, malloc, or realloc function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.
我对此进行调试的建议是阅读open cv文档并确保正确分配每个Matrix中的内存。 cv :: Mat的内部是一个'header'和一个指向已分配内存的指针,用于存储实际数据。当您声明矩阵时会创建“标题”,但是需要对该对象进行不同的调用,无论是复制还是分配,都需要分配Mat指向的内存。问题可能是因为在引用计数低于零之前没有分配内部内存并且调用了析构函数但是我对cv :: Mat的析构函数没有很多经验。您应该在这里查看第一个代码示例:http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html