内存申请释放频繁问题
2014-07-24 11:08
218 查看
内存不断的申请,再不断的释放,程序跑的过程中可能就会出现申请不一定成功,或释放不一定成功,导致出现内存泄露的现象。
如下列:
CvCapture* cap = cvCreateFileCapture(filePath);
IplImage* frame;
for (;;)
{
frame = cvQueryFrame(cap);
if( !frame)
break;
imshow("frame",frame);
cvWaitKey(1);
dst_cvsize.width = WIDTH; //目标图像的宽为源图象宽的scale倍
dst_cvsize.height =HEIGHT; //目标图像的高为源图象高的scale倍
dst = cvCreateImage( dst_cvsize, frame->depth,frame->nChannels); //构造目标图象
cvResize(frame, dst, CV_INTER_LINEAR); //缩放源图像到目标图像
cot++;
inputImage.push_back(dst);
if (cot==1)
{
BrightDetection brightDet;
brightDet.Detect(inputImage,detectedValue,errorMessage);
//printf("%f\n",detectedValue);
if (detectedValue>=200)
{
printf("alarm--detectedValue: %f\n",detectedValue);
}
else if (detectedValue>=180)
{
printf("attention--detectedValue: %f\n",detectedValue);
}
cot =0;
detectedValue = 0.0;
for (image_list_type::iterator _iteratorForDeal=inputImage.begin();_iteratorForDeal!=inputImage.end();_iteratorForDeal++)
{
IplImage* _imgForDeal=*_iteratorForDeal;
cvReleaseImage(&_imgForDeal);
//先不要释放,最后统一释放
}
for (image_list_type::iterator ir_del=inputImage.begin();inputImage.end()!=ir_del;) //刚开始时,m_curcolortrack_list为空
{
ir_del=inputImage.erase(ir_del);//以容器为单位进行删除,此处就不是以索引号。
}
}
}
为防止频繁申请内存和释放内存,一般一次性将内存申请好,最后用完统一释放。也就是说,针对类中,一般在构造函数中申请好内存,用完后统一在析构函数中释放。这样就能减少申请和释放内存的频率。
如下列:
CvCapture* cap = cvCreateFileCapture(filePath);
IplImage* frame;
for (;;)
{
frame = cvQueryFrame(cap);
if( !frame)
break;
imshow("frame",frame);
cvWaitKey(1);
dst_cvsize.width = WIDTH; //目标图像的宽为源图象宽的scale倍
dst_cvsize.height =HEIGHT; //目标图像的高为源图象高的scale倍
dst = cvCreateImage( dst_cvsize, frame->depth,frame->nChannels); //构造目标图象
cvResize(frame, dst, CV_INTER_LINEAR); //缩放源图像到目标图像
cot++;
inputImage.push_back(dst);
if (cot==1)
{
BrightDetection brightDet;
brightDet.Detect(inputImage,detectedValue,errorMessage);
//printf("%f\n",detectedValue);
if (detectedValue>=200)
{
printf("alarm--detectedValue: %f\n",detectedValue);
}
else if (detectedValue>=180)
{
printf("attention--detectedValue: %f\n",detectedValue);
}
cot =0;
detectedValue = 0.0;
for (image_list_type::iterator _iteratorForDeal=inputImage.begin();_iteratorForDeal!=inputImage.end();_iteratorForDeal++)
{
IplImage* _imgForDeal=*_iteratorForDeal;
cvReleaseImage(&_imgForDeal);
//先不要释放,最后统一释放
}
for (image_list_type::iterator ir_del=inputImage.begin();inputImage.end()!=ir_del;) //刚开始时,m_curcolortrack_list为空
{
ir_del=inputImage.erase(ir_del);//以容器为单位进行删除,此处就不是以索引号。
}
}
}
为防止频繁申请内存和释放内存,一般一次性将内存申请好,最后用完统一释放。也就是说,针对类中,一般在构造函数中申请好内存,用完后统一在析构函数中释放。这样就能减少申请和释放内存的频率。
相关文章推荐
- 频繁分配释放内存导致的性能问题的分析
- 关于在dll中申请内存,外部释放的问题
- linux频繁存取文件内存不释放问题
- [百度分享]频繁分配释放内存导致的性能问题的分析
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 【百度分享】频繁分配释放内存导致的性能问题的分析
- 【百度分享】频繁分配释放内存导致的性能问题的分析
- 解决频繁指针申请和释放所遇到的问题
- 频繁分配释放内存导致的性能问题的分析
- 频繁分配释放内存导致的性能问题的分析
- 频繁分配释放内存导致的性能问题的分析
- 如何避免内存频繁地申请与释放
- [百度分享]频繁分配释放内存导致的性能问题的分析
- 频繁分配释放内存导致的性能问题的分析
- (转)!!频繁分配释放内存导致的性能问题的分析 --(附)malloc分配原理浅析 mmap关注焦点 如何优化分配内存
- 跨module(exe、dll)间传递c++对象发生申请/释放内存违例的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 频繁分配释放内存导致的性能问题的分析
- 内存分配--频繁分配释放内存导致的性能问题的分析
- 频繁分配释放内存导致的性能问题的分析