有关内存释放的一些问题
轉(zhuǎn)載請注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7586847
前一天把系統(tǒng)整個重寫了一遍,脈絡(luò)清晰了很多,也終于解決了以前很多崩潰,異常退出的問題。這里小小總結(jié)一下自己遇到的麻煩。
1、內(nèi)存泄露
內(nèi)存泄露是說沒有釋放已經(jīng)不能使用的內(nèi)存,這里一般指堆的內(nèi)存才需要顯示的釋放。比如用malloc,calloc,realloc,new分配的內(nèi)存是在堆上的,需要用free,delete顯示的回收。內(nèi)存泄露最明顯的一是程序很慢,在運行程序時你可以啟動任務(wù)管理器,會看到程序占用的內(nèi)存一直“砰砰砰”的往上漲:
最后直接崩潰,或者你關(guān)閉程序的時候也會異常退出,出現(xiàn)
Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
之類的問題。
除了new的對象我們知道要delete。OpenCV中使用cvCreateImage()新建一個IplImage*,以及使用cvCreateMat()新建一個CvMat*,都需要cvReleaseImage() ?cvReleaseMat()顯示的釋放
[cpp]?view plaincopy
比如從二值圖像中尋找輪廓的函數(shù)cvFindContours():
[cpp]?view plaincopy
以及人臉識別中檢測人臉的函數(shù):
[cpp]?view plaincopy
注意這里我們可以使用
cvReleaseMemStorage( &faces->storage);
來釋放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage);
釋放內(nèi)存,這是等效的,但一定不要用兩次!!
2、一塊內(nèi)存多次釋放
對應(yīng)沒有釋放內(nèi)存,對應(yīng)就是一個內(nèi)存釋放多次,如同上面的 cvReleaseMemStorage用了兩次。可能報錯的地方:
[cpp]?view plaincopy
除了上述的MemStorge問題,使用cvQueryFrame()取出CvCapture*每幀圖像,只需在最后釋放CvCapture*,不需要釋放IplImage*
[cpp]?view plaincopy
*這篇是以前寫的,其實還是建議大家用C++接口的OpenCV,內(nèi)存問題很少了~
總結(jié)
以上是生活随笔為你收集整理的有关内存释放的一些问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像代数运算:平均值去噪,减去背景
- 下一篇: 数据降维工具箱drtoolbox