【发布时间】:2016-03-31 08:54:58
【问题描述】:
我有这样的课程:
class MyClass
{
cv::Mat image;
public:
init()
{
image=imread("test.jpg");
}
cv::Mat getImage()
{
return image;
}
void reset()
{
// what should I write here?
}
}
cv::Mat myImage;
void main()
{
MyClass myclass;
myclass.init();
myImage=myclass.getImage();
// do something with image;
myclass.reset();
// at this point the memory allocated by myclass.image should be released and also myImage should be invalidated (be an empty image).
}
注意:我知道我可以将 myImage 设为局部变量并解决问题,但我想知道如何释放由 cv::Mat 分配的内存,即使引用计数不为零。
image.release() 不会释放内存,因为存在图像副本 (myImage),我需要确保即使存在图像副本也释放内存。
对于那些可能抱怨使 myImage 无效的人,类规范说,当调用 reset 时,由类创建的所有图像都变得无效,如果用户需要图像,他们需要在类上调用 reset 之前克隆它。
编辑1
deallocate 不起作用,它不会释放内存。
【问题讨论】:
-
您必须保留对仍在使用图像的所有位置的引用并重置这些位置。你为什么打扰?你为什么要强行使某些东西无效?
-
@UlrichEckhardt 释放内存!我需要内存,我不能强迫我的班级用户释放内存。但是如果我释放内存,它会使图像的副本失效。
-
您是否考虑过类似于
shared_ptr和weak_ptr的方法? -
你的类规范是什么,你为什么不只存储一个原始指针,例如,
cv::Mat * MyClass::getImage()。尽其所能。
标签: c++ opencv memory-management