生活随笔
收集整理的這篇文章主要介紹了
有关内存释放的一些问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載請注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7586847
前一天把系統整個重寫了一遍,脈絡清晰了很多,也終于解決了以前很多崩潰,異常退出的問題。這里小小總結一下自己遇到的麻煩。
1、內存泄露
內存泄露是說沒有釋放已經不能使用的內存,這里一般指堆的內存才需要顯示的釋放。比如用malloc,calloc,realloc,new分配的內存是在堆上的,需要用free,delete顯示的回收。內存泄露最明顯的一是程序很慢,在運行程序時你可以啟動任務管理器,會看到程序占用的內存一直“砰砰砰”的往上漲:
最后直接崩潰,或者你關閉程序的時候也會異常退出,出現
Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
之類的問題。
除了new的對象我們知道要delete。OpenCV中使用cvCreateImage()新建一個IplImage*,以及使用cvCreateMat()新建一個CvMat*,都需要cvReleaseImage() ?cvReleaseMat()顯示的釋放
[cpp]?view plaincopy
IplImage*?subImg=cvCreateImage(?cvSize((img->width)*scale,(img->height)*scale),?8,?3?);?? CvMat?*tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));?? cvReleaseImage(&subImg);?? cvReleaseMat(&tempMat);??
另外一些函數要用到 CvSeq*來存放結果(通常這些都要用cvCreateMemStorage()事先分配一塊內存CvMemStorage*),都要是釋放掉相應的內存,這是很難找的。
比如從二值圖像中尋找輪廓的函數cvFindContours():
[cpp]?view plaincopy
CvMemStorage*?m_storage=cvCreateMemStorage(0);?? CvSeq?*?m_contour=0;?? cvFindContours(?img,?m_storage,?&m_contour,?sizeof(CvContour),?CV_RETR_LIST,?CV_CHAIN_APPROX_SIMPLE,?cvPoint(0,0));?? ?? cvReleaseMemStorage(&m_storage);??
以及人臉識別中檢測人臉的函數:
[cpp]?view plaincopy
CvMemStorage*?m_storage=cvCreateMemStorage(0);?? CvHaarClassifierCascade*?cascade?=?(CvHaarClassifierCascade*)cvLoad(?cascade_name,?0,?0,?0?);?? CvSeq*?faces?=?cvHaarDetectObjects(?img,?cascade,?m_storage,1.1,?2,?0,cvSize(30,?30)?);?? ?? cvReleaseMemStorage(?&faces->storage);?? cvReleaseHaarClassifierCascade(?&cascade?);??
注意這里我們可以使用
cvReleaseMemStorage( &faces->storage);
來釋放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage);
釋放內存,這是等效的,但一定不要用兩次!!
2、一塊內存多次釋放
對應沒有釋放內存,對應就是一個內存釋放多次,如同上面的 cvReleaseMemStorage用了兩次。可能報錯的地方:
[cpp]?view plaincopy
__declspec(noinline)?? void?__cdecl?_CRT_DEBUGGER_HOOK(int?_Reserved)?? {?? ?????? ????(_Reserved);?? ????_debugger_hook_dummy?=?0;?? }??
或者: Unhandled exception at XXXXXXXXXX in XXX.exe: XXXXXXXXXXX: 堆已損壞。?
除了上述的MemStorge問題,使用cvQueryFrame()取出CvCapture*每幀圖像,只需在最后釋放CvCapture*,不需要釋放IplImage*
[cpp]?view plaincopy
CvCapture*?pCapture?=?cvCreateCameraCapture(-1);?? IplImage*?pFrame=cvQueryFrame(?pCapture?);?? cvReleaseCapture(&pCapture);??
*這篇是以前寫的,其實還是建議大家用C++接口的OpenCV,內存問題很少了~
總結
以上是生活随笔為你收集整理的有关内存释放的一些问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。