【发布时间】:2011-03-05 00:35:44
【问题描述】:
我在这里第一次尝试使用 shared_ptr,但我在执行此操作时遇到了一些麻烦。
我想在每一帧都得到一个 IplImage 并分配给一个 shared_ptr 类成员,释放最后一个图像。是这样的:
class Detector {
public:
void Detector::updateImage {
main_image_.reset(cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3));
}
private:
boost::shared_ptr<IplImage> main_image_;
}
我在循环中调用 updateImage。 cvCreateImage 为该图像大小动态分配一些内存。
循环第一次运行时,一切正常。现在,我第二次收到 _BLOCK_TYPE_IS_VALID 断言错误。当 shared_ptr 试图删除指针时会发生这种情况。
所以,假设我做错了什么,我尝试了许多其他选项,例如:
if (!main_image_)
main_image_ = boost::shared_ptr<IplImage> (cvCreateImage...
else
main_image_.reset(cvCreateImage...)
也没有用。尝试先重置 shared_ptr ,也没有工作。尝试设置一个新的临时 shared_ptr 并分配给我的 main_image_ptr。没有成功。
我哪里错了?使用常规指针并手动释放图像就像一个魅力。
提前致谢,
西奥
【问题讨论】:
-
IplImage和cvCreateImage()的定义是什么? -
这与您的
shared_ptr问题无关,但我想指出,为每帧分配 640x480 图像对我来说似乎非常低效。您可能需要考虑重用已分配的图像。查看一种称为“双缓冲”的技术 (en.wikipedia.org/wiki/…)。 -
@Maxim。 IplImage 是 OpenCV 中使用的一种结构。它保存图像的数据和元数据。 cvCreateImage 也是来自 OpenCV 并为此分配必要的内存。 @Emile:当然你是对的。应该更好地重用相同的图像,只是将所有东西都涂成黑色。甚至不需要使用双缓冲。感谢您的提醒。
标签: c++ boost shared-ptr