在Mat中自动释放用户数据。可能吗?

时间:2013-09-06 14:50:18

标签: c++ opencv mat

我正在创建一个带有数据的Mat实例,我从单独的文件中获取。通过这样做,我失去了自动内存管理的优势:

char* data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );

Docs说我必须自己释放这段记忆。

delete[] data;

我想要的是一旦Mat实例超出范围就会释放内存。好像我用imread函数创建了Mat。

Docs提供Ptr<>的使用。模板类作为智能指针。(http://docs.opencv.org/modules/core/doc/intro.html)但我不知道如何将它与char数组一起使用。

我想我可以为Mat编写一个包装器,它将释放内存。但还有其他方法吗?

提前致谢。

更新:

是的,这种使用Ptr的方式编译得很好,但仍然一切都没有按预期工作。我以为我没有正确使用Ptr。看起来我的问题的本质就在于此。这是我的代码:

Mat readImage() {

...

Ptr<char> data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );
return image;}

当函数返回时,这可能是我的智能指针搞砸了吗?这是因为在我的代码中函数返回时会复制Mat吗?

更新II:

实际上我希望在函数返回后不释放数据。我试过这段代码:

Mat readImage() {

...

Ptr<char> data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );
data.addref();
return image;}

但事实证明,根本不使用智能指针。参考计数器在Mat对象死亡时不会减少,正如我希望的那样。但我真的可以在图像上做clone()来使数据使用自动内存管理。我得到一些开销,但我可以忍受这个。感谢sgar91,他提到了clone()函数。

1 个答案:

答案 0 :(得分:3)

文档清楚地说明了如何使用Ptr类进行自动内存管理。

而不是:

char* data = new char[dataLength];

你可以这样做:

cv::Ptr<char> data = new char[dataLength];