新手學習opencv十 記憶體洩露

2021-07-11 05:48:17 字數 2569 閱讀 5898

opencv中常見函式介面,用完需釋放或銷毀的。

讀取攝像頭

1. cvcapture* m_pcapture = cvcreatecameracapture(videopath);  

2. cvreleasecapture(&m_pcapture); 

中捕獲攝像頭

3. ccamerads m_camds;

4. m_camds.opencamera(0, false, 320, 240))

5. m_camds.closecamera();

7. cvcapture* m_pcapture = cvcreatefilecapture(videopath)

8. cvreleasecapture(&m_pcapture);

//4.讀取檔案

//5.視窗控制代碼

cvnamedwindow("showimage");

cvdestroywindow("showimage");

cdc* pdc = getdlgitem(id)->getdc();

releasedc( pdc );//釋放

cdc類的指標

cvvimage cimg;

cimg.copyof( img );   

//6.用完

cimg

後cimg.drawtohdc( hdc, &rect );

cimg.destroy();

//7.建立影象

9. iplimage* subimg=cvcreateimage( cvsize((img->width)*scale,(img->height)*scale), 8, 3 ); 

10. cvreleaseimage(&subimg);

//8.建立矩陣

11. 

cvmat *tempmat=cvcreatemat((img->width)*scale,(maxface->height)*scale,cv_maketype(image->depth,image->nchannels)); 

12. cvreleasemat(&tempmat);

13.//9.建立矩陣記憶體

14. cvmemstorage* m_storage=cvcreatememstorage(0); 

15. cvreleasememstorage(&m_storage); 

記憶體洩露的最終結果是程式執行時間越長,占用儲存空間越來越多,最終用盡全部儲存空間,整個

系統崩潰

。所以「記憶體洩漏」是從作業系統的角度來看的。這裡的儲存空間並不是指物理記憶體,而是指虛擬記憶體大小,這個虛擬記憶體大小取決於磁碟交換區設定的大小。由程式申請的一塊記憶體,如果沒有任何乙個

指標指向它,那麼這塊記憶體就洩漏了

以發生的方式來分類,記憶體洩漏可以分為4類:

發生記憶體洩漏的**會被多次執行到,每次被執行的時候都會導致一塊記憶體洩漏。

發生記憶體洩漏的**只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以

測試環境和測試方法對檢測記憶體洩漏至關重要。

發生記憶體洩漏的**只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊且僅一塊記憶體發生洩漏。比如,在類的

建構函式中分配記憶體,在

析構函式中卻沒有釋放該記憶體,所以記憶體洩漏只會發生一次。

程式在執行過程中不停的分配記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡並沒有發生記憶體洩漏,因為最終程式釋放了所有申請的記憶體。但是對於乙個伺服器程式,需要執行幾天、幾周甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體洩漏為隱式記憶體洩漏。

1.malloc,new申請的

堆記憶體洩

漏(heap leak),如果程式的設計的錯誤導致這部分記憶體沒有被釋放,那麼此後這塊記憶體將不會被使用,就會產生heap leak。

一般這種情況下,記住分配記憶體,使用前檢查是否分配成功,用完後釋放,釋放後對指標賦值為null(防止野指標)。

2.在opencv中,opencv的資料結構和一些介面要求用完後, 必須釋放,否則會引起記憶體洩露,導致系統記憶體原來越少。如下圖的測試截圖。乙個簡單的攝像頭採集**,程式占用系統記憶體越來越大。

OpenCV記憶體洩露的檢測

上文介紹了c c 編碼中記憶體洩露的問題,不過經過本人測試,好像對用opencv工具包進行編碼中的記憶體洩露並不起作用。crtsetdbgflag函式應該針對new malloc這種方式分配記憶體的,而opencv的很多函式把記憶體分配封裝了,直接返回乙個指標 e.g.cvcreateimage返回...

opencv中會引起記憶體洩露的情況

記憶體洩露時,可以用最簡單的注釋法查詢 把 一部分一部分放開 根據資源管理器檢視我們自己編寫的程式記憶體使用情況。1.img temp cvcloneimage imgtmp 迴圈使用會引起記憶體洩露 cvcopy imgtmp,img temp,null 迴圈使用不會引起記憶體洩露 2.cvfin...

OpenCV記憶體洩露小總結及相應處理方法

以下文章共總結出cvloadimage cvcloneimage cvgetrow 三個函式容易由於使用不當而洩露記憶體,要注意!首先,感謝 初心者的共享,正文如下 opencv中的記憶體洩露問題 cvloadimage函式 摘自 在做專案的過程中,使用opencv經常會出現一些記憶體洩露問題,自己...