C++ 在stl容器中释放opencv图像?
我在释放存储在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
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.