我在这里第一次尝试使用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。没有成功。
我在哪里错了?使用常规指针并手动释放图像就像魅力一样。
提前致谢,
西奥
答案 0 :(得分:3)
我假设你在调试版本中看到了这个错误?
cvCreateImage()
使用哪种分配内存的方法? new
或malloc()
? boost::shared_ptr
使用delete
来销毁内存,因此您的系统可能会检测到数据未按“正确方式”分配,即使用new。
如果是这种情况,则必须使用带有自定义删除器的shared_ptr
(查看增强文档以获取更多信息),以便正确释放内存。