munmap_chunk(): 使用 openCV CV::P tr 的指针错误无效

munmap_chunk(): invalid pointer error using opencv cv::Ptr

本文关键字:tr 指针 无效 错误 CV openCV chunk 使用 munmap      更新时间:2023-10-16

我正在编写我的第一个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);