C++ 在每个帧的共享ptr中动态分配图像
我在这里第一次尝试使用shared_ptr,但在这方面遇到了一些问题 我希望获得每一帧的am IplImage,并分配给共享的\u ptr类成员,释放最后一张图像。是这样的:C++ 在每个帧的共享ptr中动态分配图像,c++,boost,shared-ptr,C++,Boost,Shared Ptr,我在这里第一次尝试使用shared_ptr,但在这方面遇到了一些问题 我希望获得每一帧的am IplImage,并分配给共享的\u ptr类成员,释放最后一张图像。是这样的: class Detector { public: void Detector::updateImage { main_image_.reset(cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3)); } private:
class Detector {
public:
void Detector::updateImage {
main_image_.reset(cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3));
}
private:
boost::shared_ptr<IplImage> main_image_;
}
类检测器{
公众:
空洞检测器::更新图像{
主图像重设(cvCreateImage(cvSize(640480),IPL深度(8U,3));
}
私人:
boost::共享\u ptr主\u映像\uu;
}
我在循环中调用updateImage。cvCreateImage为该图像大小动态分配一些内存
循环第一次运行时,一切正常。现在,我第二次得到一个_BLOCK_TYPE_IS_VALID断言错误。当shared_ptr试图删除指针时会发生这种情况
所以,假设我做错了什么,我尝试了很多其他选择,比如:
if (!main_image_)
main_image_ = boost::shared_ptr<IplImage> (cvCreateImage...
else
main_image_.reset(cvCreateImage...)
如果(!主图像)
主映像=boost::共享映像(cvCreateImage。。。
其他的
主映像重置(cvCreateImage…)
也不起作用。尝试先重置共享\u ptr,也不起作用。尝试设置新的临时共享\u ptr并分配给我的主\u映像\uptr。未成功
我哪里做错了?使用常规指针并手动释放图像效果很好
提前感谢,
Theo我假设您在调试版本中看到了这个错误
cvCreateImage()
使用哪种分配内存的方法?new
或malloc()
?boost::shared_ptr
使用delete
销毁内存,因此系统可能会检测到数据分配方式不正确,即使用new
如果是这种情况,那么您必须使用带有自定义删除器的
共享\u ptr
(查看boost文档了解更多信息),以便正确释放内存。我假设您在调试版本中看到此错误
cvCreateImage()
使用哪种分配内存的方法?new
或malloc()
?boost::shared_ptr
使用delete
销毁内存,因此系统可能会检测到数据分配方式不正确,即使用new
如果是这种情况,那么您必须使用带有自定义删除器的
共享\u ptr
(查看boost文档了解更多信息),以便正确释放内存。IplImage和cvCreateImage()的定义是什么?这与你的<代码> SydDypPT/<代码>问题无关,但我想指出,为每个帧分配640x480图像对我来说效率很低。你可能需要考虑重用已分配的图像。请检查一种称为“双缓冲”的技术()。@Maxim.IplImage是OpenCV中使用的一种结构。它保存图像的数据和元数据。cvCreateImage也是OpenCV的一种形式,并为此分配必要的内存。@Emile:当然,你是对的。应该更好地重用相同的图像,只是将所有内容都涂成黑色。甚至不需要使用双缓冲。谢谢提醒。“代码> IplImage <代码> >代码> CVCCRATIMAGE()/<代码>?这与你的<代码> SyddYPPT/<代码>问题无关,但我想指出,为每个帧分配640x480图像对我来说效率很低。你可能需要考虑重用已分配的图像。“双缓冲”()@Maxim.IplImage是OpenCV中使用的一种结构。它保存图像的数据和元数据。cvCreateImage也是OpenCV的一种形式,并为此分配必要的内存。@Emile:当然,你是对的。应该更好地重用相同的图像,只是将所有内容都涂成黑色。甚至不需要使用双缓冲。谢谢提醒。+1即使cvCreateImage()
不分配使用new
,您可以将自定义deallocator分配给共享的\u ptr
,作为中的第二个参数。@Sam,这就是我所指的自定义删除器-我想这就是Boost文档中所称的…是的,我只是想添加一条注释,表明我的向上投票,而不是编辑您的回答。@Sam和@Timo,你们都明白了!cvCreateImage使用malloc分配新映像。我将尝试自定义删除程序!非常感谢!@Theo,很高兴你们发现了问题。+1即使cvCreateImage()
不分配使用new
,您可以将自定义deallocator分配给共享的\u ptr
,作为中的第二个参数。@Sam,这就是我所指的自定义删除器-我想这就是Boost文档中所称的…是的,我只是想添加一条注释,表明我的向上投票,而不是编辑您的回答。@Sam和@Timo,你们都明白了!cvCreateImage使用malloc分配新映像。我将尝试自定义删除程序!非常感谢!@Theo,很高兴你们发现了这个问题。