我正在编写我的第一个opencv代码(实际上是第一个C++代码),当我尝试使用cv::P tr时遇到了一个奇怪的munmap_chunk(): invalid pointer
错误。我在其他帖子中看到,这通常是由于释放了已经释放的区域而导致的,但我认为我没有。
以下简单的测试函数将生成该错误。
void testing(void) {
int i=2;
Ptr< Mat > pointer=new Mat[i];
}
从调试器来看,析构函数似乎在函数返回时触发了错误。我不知道为什么,因为基本上我对 ptr 什么也没做。那么为什么会发生这种情况,正确的用法是什么?
提前谢谢。
在C++中,分配new
的内存与分配new []
的内存之间存在显着差异。
int* p = new int;
delete p;
p = new int[8];
delete p; // error/crash
delete [] p; // correct
Ptr 类是一个 RAII 容器,用于管理指针的所有权。当您分配给它时,它将获得该分配的所有权,这意味着当 Ptr 超出范围时(在本例中为函数末尾),它将delete
它。
默认情况下,它使用delete
,因此您的崩溃,文档建议您将需要使用允许您指定自己的删除器的构造函数:
// see http://docs.opencv.org/master/d0/de7/structcv_1_1Ptr.html
void array_deleter(Mat* m)
{
delete [] m;
}
Prt<Mat> ptr(new Mat[i], array_deleter);