我正在尝试学习在向量中释放指针,我已阅读此页面上的问题,并按照答案编写一些测试代码。我从网络摄像头抓取图像并首先将所有图像存储在内存中,抓住所有图像后,我将所有图像保存为jpg格式。
一切正常,我可以将图像存储在内存中,然后我可以将它们全部保存到jpg中。但问题是,当我试图释放向量中的所有元素时,它总是给我一些错误。它总是去dbgheap.c:IsValidHeapPointer。我是Virtual C ++和C ++的新手,所以我不知道为什么会出现这个错误。
我使用OpenCV来抓取图像并保存图像,但我确定问题不是关于OPENCV而是删除矢量。所以也许我会想念一些东西,所以有人能给我一些暗示吗? 非常感谢你提前。 代码不知何故喜欢这个:
std::vector<IplImage*> images(30);
IplImage* TheImage;
for (int j=0;j<30;j++){
TheImage=camera.QueryFrame();
images[j]=(IplImage*)cvClone(TheImage);
if(cvWaitKey(20)==27)
break;
}
cvDestroyWindow("camera");
CString ImagesName;
for(int i=0;i<30;i++){
ImagesName.Format(_T("Image%.3d.jpg"), i);
cvSaveImage(ImagesName,images[i]);
}
int s=images.size();
for(size_t i = 0; i <s ; ++i)
{
delete images[i];// Here should be cvReleaseImage(images[i]);
}
/ *
for(std :: vector :: iterator i = images.begin(),endI = images.end(); i!= endI; ++ i)
{
删除* i;
}
* /
images.clear();
答案 0 :(得分:2)
您遇到问题的原因是图片未使用new
创建。作为C的OpenCV使用malloc()
。但在尝试致电free()
之前,请使用为此提供的功能:cvReleaseImage()
。
旁注:仅仅因为名为CreateSomething
的函数返回指针并不意味着您甚至无法删除/释放它所指向的内存。看看下面的代码,它完全没问题,但你自己无法释放内存。这可能看起来很奇怪,但是这样的函数可能会使用某种保留的内存映射或其他任何东西来处理它们的内存。
int someint;
int *CreateInt()
{
return &someint;
}
答案 1 :(得分:1)
图片的内存分配在cvClone
内的某处。我不是OpenCV专家(这是OpenCV,对吗?)但我认为你应该通过调用cvRelease
而不是delete
来释放它们。
答案 2 :(得分:1)
images[j]=(IplImage*)cvClone(TheImage);
释放未由您分配的指针。请注意如何通过调用库函数来获取它。你怎么知道函数使用new来分配图像,而不是像malloc?
答案 3 :(得分:1)
如果我在这里错了,请纠正我,但我认为你的最终循环将访问所有30个向量条目,而不仅仅是你初始化的条目。因此,除了删除内存应该 cvReleased ()或其他内容之外,您可能还会尝试删除 NULL。