前一天把系統整個重寫了一遍,脈絡清晰了很多,也終於解決了以前很多崩潰,異常退出的問題。這裡小小總結一下自己遇到的麻煩。
記憶體洩露是說沒有釋放已經不能使用的記憶體,這裡一般指堆的記憶體才需要顯示的釋放。比如用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()顯示的釋放
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():
cvmemstorage* m_storage=cvcreatememstorage(0);
cvseq * m_contour=0;
//釋放記憶體
cvreleasememstorage(&m_storage);
以及人臉識別中檢測人臉的函式:
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);
釋放記憶體,這是等效的,但一定不要用兩次!!
對應沒有釋放記憶體,對應就是乙個記憶體釋放多次,如同上面的 cvreleasememstorage用了兩次。可能報錯的地方:
__declspec(noinline)
void __cdecl _crt_debugger_hook(int _reserved)
或者: unhandled exception at *********x in ***.exe: *********xx: 堆已損壞。
除了上述的memstorge問題,使用cvqueryframe()取出cvcapture*每幀影象,只需在最後釋放cvcapture*,不需要釋放iplimage*
cvcapture* pcapture = cvcreatecameracapture(-1);
iplimage* pframe=cvqueryframe( pcapture );
cvreleasecapture(&pcapture);
*這篇是以前寫的,其實還是建議大家用c++介面的opencv,記憶體問題很少了~ 有關內聯函式的一些事
有關內聯函式的一些事,thinking in c 和 effective c 的學習筆記。內聯函式是c 用來替換巨集而引入的。c中的巨集在省去函式呼叫的開銷的同時引入了不易發現的bug,主要是由對引數求值引起的。一 內聯函式如何起作用 對於普通函式,編譯器只把函式名稱 對於c 來說也包含了引數型別?...
記憶體釋放的一些大坑
1 include2 3 include4 5 6 int main 7 33 問題1 free 釋放的原理是什麼,因為即使記憶體釋放後,也是有可能能對對其進行操作賦值訪問操作的,所以怎麼證明記憶體已經被釋放了?問題2 char p char malloc 100 p 6 char q p 6 fr...
有關OpenCV的一些基礎問題
opencv是intel公司推出的優秀的視覺庫,它提供了許多與視覺計算相關的函式,極大的方便了開發人員。但是,由於它和我們常用的微軟體系的軟體有所不同,還是讓我困惑了許久,現在我就把不同之處整理出來,希望對大家有所幫助。1 opencv在用cvloadimage時,自動將帶有調色盤的影象在記憶體內轉...