C++ 在opencv中使用级联分类器的detectMultiScale是否会泄漏内存?

C++ 在opencv中使用级联分类器的detectMultiScale是否会泄漏内存?,c++,memory-leaks,opencv,C++,Memory Leaks,Opencv,正如标题所说。我尝试在图像上运行一个简单的人脸检测器: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/objdetect/objdetect.hpp> using namespace cv; int main(int argc, cha

正如标题所说。我尝试在图像上运行一个简单的人脸检测器:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>

using namespace cv;

int main(int argc, char** argv)
{
  Mat image = imread("V2.jpg", 1);
  CascadeClassifier face_cascade;
  face_cascade.load("haarcascade_frontalface_alt.xml");
  vector<Rect> faces;
  face_cascade.detectMultiScale(image, faces);
  return 0;
}
#包括
#包括
#包括
#包括
使用名称空间cv;
int main(int argc,字符**argv)
{
Mat image=imread(“V2.jpg”,1);
层叠式分级机;
face_cascade.load(“haarcascade_frontalface_alt.xml”);
向量面;
面_级联。检测多尺度(图像、面);
返回0;
}
根据valgrind的说法,以下代码从detectMultiScale功能泄漏。这里有我忽略的好习惯吗?有什么要发布的吗?从逻辑上讲,从我的角度来看,所有内容都在堆栈上,因此应该在程序结束时释放它

valgrind的输出是:

==4852==    at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==4852==    by 0x4EB1D90: cv::fastMalloc(unsigned long) (in /usr/lib/libopencv_core.so.2.3.1)
==4852==    by 0x58F175D: ??? (in /usr/lib/libopencv_objdetect.so.2.3.1)
==4852==    by 0x58F8699: cvHaarDetectObjectsForROC(void const*, CvHaarClassifierCascade*, CvMemStorage*, std::vector<int, std::allocator<int> >&, std::vector<double, std::allocator<double> >&, double, int, int, CvSize, CvSize, bool) (in /usr/lib/libopencv_objdetect.so.2.3.1)
==4852==    by 0x58EA38B: cv::CascadeClassifier::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, std::vector<int, std::allocator<int> >&, std::vector<double, std::allocator<double> >&, double, int, int, cv::Size_<int>, cv::Size_<int>, bool) (in /usr/lib/libopencv_objdetect.so.2.3.1)
==4852==    by 0x58DA6B5: cv::CascadeClassifier::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>) (in /usr/lib/libopencv_objdetect.so.2.3.1)
==4852==at 0x4C28F9F:malloc(vg\u replace\u malloc.c:236)
==4852==by 0x4EB1D90:cv::fastMalloc(无符号长)(in/usr/lib/libopencv_core.so.2.3.1)
==4852==0x58F175D:???(在/usr/lib/libopencv_objdetect.so.2.3.1中)
==4852==by 0x58F8699:CVHAARDEtectObjectsError(void const*、CvHaarClassifierCascade*、CvMemStorage*、std::vector&、std::vector&、double、int、int、CvSize、CvSize、bool)(在/usr/lib/libopencv_objdetect.so.2.3.1中)
==4852==by 0x58EA38B:cv::CascadeClassifier::detectMultiScale(cv::Mat const&,std::vector&,std::vector&,std::vector&,double,int,int,cv::Size_uuu,cv::Size_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
==4852==by 0x58DA6B5:cv::CascadeClassifier::detectMultiScale(cv::Mat const&,std::vector&,double,int,int,cv::Size_,cv::Size_)(in/usr/lib/libopencv_objdetect.so.2.3.1)

这是在运行64位Windows 7的64位Kubuntu 11.10的VMware VM上运行的。OpenCV版本是最新的-2.3.1。

您必须释放变量面

我不确定Valgrind的错误消息,但如果有泄漏,它肯定不在您的代码中。尽管尝试更新到2.4.2,但速度也快得多

当它超出范围时,
faces
不是被破坏了吗?在销毁时,向量将调用它所持有的每个对象的析构函数。还是我错了?