OpenCV 有關記憶體釋放的一些問題

2021-06-06 15:02:29 字數 2437 閱讀 4717

前一天把系統整個重寫了一遍,脈絡清晰了很多,也終於解決了以前很多崩潰,異常退出的問題。這裡小小總結一下自己遇到的麻煩。

記憶體洩露是說沒有釋放已經不能使用的記憶體,這裡一般指堆的記憶體才需要顯示的釋放。比如用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時,自動將帶有調色盤的影象在記憶體內轉...