0

我正在为游戏中的多个对象使用 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)

不过,每次我跑过这条线时都不会发生这个错误。我该如何调试呢?

4

1 回答 1

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 文档并确保您在每个矩阵中正确分配内存。cv::Mat 的内部是一个“标题”和一个指向存储实际数据的已分配内存的指针。声明矩阵时会创建“标头”,但是需要对对象进行不同的调用,无论是副本还是分配,来分配 Mat 指向的内存。问题可能是由于在引用计数降至零以下并调用析构函数之前未分配内部内存,但我对 cv::Mat 的析构函数没有丰富的经验。您应该在这里查看第一个代码示例:http: //docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html

于 2013-10-15T21:36:22.567 回答