C++ 在stl容器中释放opencv图像?

C++ 在stl容器中释放opencv图像?,c++,opencv,C++,Opencv,我在释放存储在stl容器中的opencv图像时遇到问题。我正在开发一个保存相机最后几帧的系统。我需要一个容器来存储图像。但是当我试图使用迭代器访问图像并释放它们时,事情就出了问题。 像这样 deque<IplImage> ImageQue; IplImage * temp=cvCreateImage(cvSize(30, 30), 8, 3); ImageQue.push_back(*temp); deque<IplImage>::iterator it=ImageQue

我在释放存储在stl容器中的opencv图像时遇到问题。我正在开发一个保存相机最后几帧的系统。我需要一个容器来存储图像。但是当我试图使用迭代器访问图像并释放它们时,事情就出了问题。 像这样

deque<IplImage> ImageQue;
IplImage * temp=cvCreateImage(cvSize(30, 30), 8, 3);
ImageQue.push_back(*temp);
deque<IplImage>::iterator it=ImageQue.begin();
//temp and temp2 pointing different mem 
IplImage * temp2=&*it;
//this goes wrong. execption at memory location.
cvReleaseImage(&temp2);
我认为问题就在这里。 迭代器it=ImageQue.begin(); IplImage*temp2=&*it


你知道吗?或者如果我想在stl容器中释放图像,建议?

我不认为C接口的
IplImage
喜欢按值复制,就像您尝试的那样。如果你想使用值语义操作的C++容器,你应该使用容器的代码> iPLIMAGI**/COD>,或者更好的是使用C++接口,它使用RAII来处理复制和释放资源(即,你不必担心释放)。.

我不认为C-interface的
IplImage
像您尝试的那样喜欢按值复制。如果你想使用值语义操作的C++容器,你应该使用容器的代码> iPLIMAGI**/COD>,或者更好的是使用C++接口,它使用RAII来处理复制和释放资源(即,你不必担心释放)。.

看起来您在间接混合和匹配指针。最好不要这样做:

deque<IplImage> ImageQue; 
IplImage * temp=cvCreateImage(cvSize(30, 30), 8, 3); 
ImageQue.push_back(*temp); 

<>你也可以考虑使用某种智能指针(在生命结束时自动释放iPrI图)…最近版本的OpenCV是否包含了一个很好的C++ API,或者是我搞错了吗?如果有合适的自定义删除程序,
std::shared\u ptr
也可以工作。

看起来您在间接混合和匹配指针。最好不要这样做:

deque<IplImage> ImageQue; 
IplImage * temp=cvCreateImage(cvSize(30, 30), 8, 3); 
ImageQue.push_back(*temp); 

<>你也可以考虑使用某种智能指针(在生命结束时自动释放iPrI图)…最近版本的OpenCV是否包含了一个很好的C++ API,或者是我搞错了吗?如果有合适的自定义删除程序,std::shared_ptr也可以工作。

您可以在C++11中使用std::shared_ptr,也可以在C++03中使用Boost等效程序

您可以在stl容器中存储对象的共享\u ptr,但需要指定删除器(默认为operator delete)

您可以在共享\u ptr的构造函数中指定指针的删除器。在您的案例中,cvReleaseImage函数

发件人:

模板共享(Y*p,D);模板共享(Y*p,D,A)

[自定义DealLocator允许工厂函数返回共享\u ptr 将用户与其内存分配策略隔离。由于 deallocator不是该类型的一部分,正在更改分配策略 不会破坏源代码或二进制代码的兼容性,并且不需要 客户端重新编译。例如,“无操作”deallocator很有用 将共享的ptr返回给静态分配的对象时,以及 其他变体允许将共享的_ptr用作 另一个智能指针,简化了互操作性

对自定义DealLocator的支持不会造成重大影响 开销。其他共享的ptr功能仍然需要使用deallocator 保留

D的复制构造函数不抛出的要求来了 如果复制构造函数抛出,则指针为 泄漏。删除该要求需要一个pass-by(const)引用

通过引用传递的主要问题在于它与 rvalues。常量引用仍可能导致复制,并且需要 常量运算符()。非常量引用不会绑定到 所有。提出的右值参考是解决此问题的一个好方法 在N1377/N1385中。]


您可以在C++11中使用std::shared_ptr,也可以在C++03中使用Boost等效程序

您可以在stl容器中存储对象的共享\u ptr,但需要指定删除器(默认为operator delete)

您可以在共享\u ptr的构造函数中指定指针的删除器。在您的案例中,cvReleaseImage函数

发件人:

模板共享(Y*p,D);模板共享(Y*p,D,A)

[自定义DealLocator允许工厂函数返回共享\u ptr 将用户与其内存分配策略隔离。由于 deallocator不是该类型的一部分,正在更改分配策略 不会破坏源代码或二进制代码的兼容性,并且不需要 客户端重新编译。例如,“无操作”deallocator很有用 将共享的ptr返回给静态分配的对象时,以及 其他变体允许将共享的_ptr用作 另一个智能指针,简化了互操作性

对自定义DealLocator的支持不会造成重大影响 开销。其他共享的ptr功能仍然需要使用deallocator 保留

D的复制构造函数不抛出的要求来了 如果复制构造函数抛出,则指针为 泄漏。删除该要求需要一个pass-by(const)引用

通过引用传递的主要问题在于它与 rvalues。常量引用仍可能导致复制,并且需要 常量运算符()。非常量引用不会绑定到 所有。提出的右值参考是解决此问题的一个好方法 在N1377/N1385中。]


你真的需要一个IplImage类型的图像吗?IplImage是一种用于OpenCV C接口的类型,您可以尝试使用cv::Mat类型来代替它。您真的需要IplImage类型中的图像吗?IPLIMAGE是一种用于OpenCV C接口的类型,可以尝试CV::Mat类型代替它。@ Rook < Cord> CV::MAT取代OpenCV的C++接口中的<代码> IplImage <代码>。code>IplImage确实不应该在C中使用
deque<IplImage*> imageQueue; 
imageQueue.push_backcvCreateImage(cvSize(30, 30), 8, 3));
// ...
auto itr = imageQueue.begin();
IplImage* temp = *itr;
cvReleaseImage(&temp);
IplImage* temp  = imageQueue.front();
imageQueue.pop_front();
cvReleaseImage(&temp);
Requirements: p must be convertible to T *. D must be CopyConstructible. 
              The copy constructor and destructor of D must not
              throw. The expression d(p) must be well-formed, must not invoke
              undefined behavior, and must not throw exceptions. A must be an
              allocator, as described in section 20.1.5 (Allocator requirements) of
              the C++ Standard.

Effects: Constructs a shared_ptr that owns the pointer p and the deleter d. 
         The second constructor allocates memory using a copy of a.

Postconditions: use_count() == 1 && get() == p.

Throws: std::bad_alloc, or an implementation-defined 
        exception when a resource other than memory could not be obtained.

Exception safety: If an exception is thrown, d(p) is called.

Notes: When the the time comes to delete the object pointed to by p, 
       the stored copy of d is invoked with the stored copy of p as an
       argument.