Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在每个帧的共享ptr中动态分配图像_C++_Boost_Shared Ptr - Fatal编程技术网

C++ 在每个帧的共享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:

我在这里第一次尝试使用shared_ptr,但在这方面遇到了一些问题

我希望获得每一帧的am IplImage,并分配给共享的\u 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_;
}
类检测器{
公众:
空洞检测器::更新图像{
主图像重设(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,很高兴你们发现了这个问题。