我正在使用从单独的文件中获取的数据创建一个 Mat 实例。这样做,我失去了自动内存管理的优势:
char* data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );
医生说我必须自己释放这段记忆。
delete[] data;
我想要的是一旦 Mat 实例超出范围就会释放内存。好像我用 imread 函数创建了 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() 函数。