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

2021-06-16 16:11:40 字數 1932 閱讀 4226

以下文章共總結出cvloadimage cvcloneimage cvgetrow 三個函式容易由於使用不當而洩露記憶體,要注意!

首先,感謝網友:初心者的共享,正文如下:

opencv中的記憶體洩露問題(cvloadimage函式)

摘自:在做專案的過程中,使用opencv經常會出現一些記憶體洩露問題,自己編寫的程式出現問題還情有可原,但若是庫函式呼叫和使用時出現,卻很令我惱 火。花了好長時間和實踐的經驗告訴我應該客服它。下面把一些檢測出的問題進行化解。(可能是水平不夠,這些函式使用不當,望高手指點)cvloadimage函式:可能大家還覺察不出來,但我深有體會,在程式中這個函式使用一次兩次感覺不來,但在處理序列影象迴圈呼叫這個函式時,記憶體洩露的可能讓你目瞪口呆!

//變數定義:cvvimage psrcimg;

iplimag *psrcimgcopy ;                       //使用iplimag變數做個拷貝。畢竟iplimag 類處理方便。

//獲取影象:

psrcimg.load(str);                                //str為cstring型別的影象檔名

psrcimgcopy = psrcimg.getimage();   //拷貝出psrcimg的影象資料。

//釋放記憶體psrcimg變數不需要每次釋放,因為每次load時是覆蓋以前的記憶體區域。psrcimgcopy 同樣。不過在程式結束時要釋放,以免產生記憶體洩露或者別人以為你忘了。cvreleaseimage(&psrcimgcopy );

psrcimg.destroy();不過要正確釋放psrcimgcopy 時,宣告時必須create下:psrcimgcopy = cvcreateimage(cvsize(imgwidht,imgheight),ipl_depth_8u, 3);//imgwidht,imgheight為影象寬和高。

opencv中的記憶體洩露問題(cvcloneimage函式)

摘自:cvcloneimage函式:這個函式也會出現記憶體洩露!雖然可以釋放,但程式複雜不知道在那裡釋放,因為它每次拷貝是製作影象的完整拷貝包括頭、roi和資料。不會覆蓋以前的內容。每次使用時編譯器會分配記憶體空間。乙個752*480大小的影象,每次洩露的記憶體大約為1m。

解決方法:使用cvcopy函式代替。cvcopy(psrcimg,pimg,null);   //代替 pimg = cvcloneimage(psrcimg);pimg初始化時必須分配空間,否則上述函式不能執行。pimg = cvcreateimage(cvsize(imgwidht,imgheight),ipl_depth_8u, 3);

摘自:大概調出來兩種情況造成的記憶體洩漏:

1.在使用clone之前沒有對目標矩陣釋放。比如:

cvmat* a = cvcreatemat(5,5,cv_32f);

cvmat* b = cvcreatemat(5,5,cv_32f);

...a = cvclonemat(b);

這樣a所指向的那個mat就會洩漏出去了。正確的做法是在clone之前release掉原來的那個矩陣。並且注意在release之後將a置空。即:

cvreleasemat(&a); a=null; 

2.在使用cvgetrow,cvgetcols等函式時,沒有對目的矩陣的資料區釋放。

比如:cvmat* a = cvcreatemat(5,5,cv_32f);cvmat* b = cvcreatemat(5,1,cv_32f);

...for(int i=0;iheight;i++)

這樣a的第i行會複製乙份然後替換掉原始的b->data.這樣也就造成了這一部分的記憶體洩漏。

正確的作法是:

for(..) 

呃,按說這些東西opencv應該能封裝好了,並且這麼重要的東西它也不在文件中寫明。

看著不多,寫出的程式如果迴圈起來就不知道洩漏多少記憶體了。。。。。。

cv的記憶體洩露真恐怖。。 

OpenCV記憶體洩露的檢測

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

C 記憶體洩露及常見情況總結

1.理解記憶體洩漏 程式中通常包含著靜態記憶體和棧記憶體。靜態記憶體用來儲存區域性static物件 類static資料成員以及定義在任何函式之外的變數 全域性變數 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷毀。對於棧物件,僅在定義的程式塊執行時...

新手學習opencv十 記憶體洩露

opencv中常見函式介面,用完需釋放或銷毀的。讀取攝像頭 1.cvcapture m pcapture cvcreatecameracapture videopath 2.cvreleasecapture m pcapture 中捕獲攝像頭 3.ccamerads m camds 4.m camd...