自动释放 Mat 中的用户数据.可能吗



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

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

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

delete[] data;

我想要的是一旦 Mat 实例超出范围,就会释放内存。好像我创建了具有读取功能的垫子。

文档提供使用 Ptr<> 模板类作为智能指针。(http://docs.opencv.org/modules/core/doc/intro.html)但是我不明白如何将其与字符数组一起使用。

我想我可以为 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 被复制了吗?

更新二:

实际上,我希望在函数返回后不会发布数据。我尝试了以下代码:

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() 函数。

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

取而代之的是:

char* data = new char[dataLength];

您可以这样做:

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

相关内容

  • 没有找到相关文章

最新更新