c 記憶體洩漏解決方案

2021-08-11 06:08:35 字數 3451 閱讀 4375

使用c++,不可避免的會遇到記憶體洩漏問題,遇到這個問題怎麼辦呢?

我是一般從這幾個方面考慮:

第1種、顯性的 new  malloc delete free 是否匹配

這是最基本的,也就不多說了。

第2種、**的,這個就較為複雜了

之所以說是**的,是因為他們沒有呼叫new malloc ,但你不注意的情況下,也有可能造成記憶體洩漏。

原因是,本來它們的資源是由它們所屬的類進行釋放的,但是,由於呼叫了某些函式,將他們的資源拿到外面來了,所以這時候就需要手動釋放了。

比如gdi時,就會碰到,

狀況1

gethbitmap(null, &hguajian);  

通過這種方式獲得hbitmap後,退出區域性函式後,系統並不自動釋放記憶體。

必須在使用後,通過deleteobject來釋放掉記憶體

deleteobject(hguajian);  

對於外部hbitmap ,估計都是需要deleteobject釋放的

cbitmap bitmap2;

hbitmap0=(hbitmap)bitmap2.getsafehandle();  

deleteobject(hbitmap0)

狀況2

又比如:

cdc memdc;  

memdc.createcompatibledc(&dc);  

cbitmap bmp;  

bmp.createcompatiblebitmap(&dc, rect.width(), rect.height());  

cbitmap *poldbmp=memdc.selectobject(&bmp); 

這樣也會發生記憶體洩漏,為什麼?

memdc 預設是有乙個1畫素的點陣圖,但是當你將這個點陣圖用

[cpp]

view plain

copy

poldbmp=memdc.selectobject(&bmp);  

選出時,memdc 就無法將這塊記憶體釋放了,當然,繪製頻率不大的時候,是可以忽略的,可是如何頻繁繪製就出吃記憶體情況了。

解決方式:

把這塊再選進去,讓cdc負責釋放,而bmp是通過cbitmap釋放掉的。

狀況3

[cpp]

view plain

copy

bitmap *pbmp = bitmap::fromhbitmap(hbitmap, null);  

這種情況下,也需delete 掉

[cpp]

view plain

copy

delete

pbmp;  

狀況4 cstring  使用不當,也洩漏

如:

else  

}

預設情況下,區域性變數的cstring出了作用域後,cstring物件是自動撤銷的。

但是,由於使用了exit(0) ,強行退出這段作用域, 因此在這段作用域中使用的cstring物件沒有得到釋放,故而出現了記憶體洩露情況。

而全域性cstring物件則不受此影響,在exit(0) 退出函式中,會自動釋放全域性cstring

因此,那只好人為撤銷了,在強行退出前,清空區域性變數cstring。

[cpp]

view plain

copy

else

}  

我結合著任務管理器,除錯著,到底是哪部分**導致了記憶體**。

最終,定位到了。

這部分**呼叫了

::createcompatibledc(hdestdc);
源**是這樣的:

//將bitmap繪製到dc上

hdc hdestdc = dc.getsafehdc();

hdc hsourcedc = ::createcompatibledc(hdestdc);

hbitmap hbitmap = null;

bitmap.gethbitmap(null, &hbitmap);

hgdiobj holdbitmap = selectobject(hsourcedc, hbitmap);

bitblt(hdestdc, pmiddlechunk->left, pmiddlechunk->top, pmiddlechunk->width, pmiddlechunk->height, hsourcedc, 0, 0, srccopy);

deleteobject(hbitmap);

deleteobject(holdbitmap);

這時就發現,記憶體不斷的**。

原因

::createcompatibledc(hdestdc);
沒有及時釋放掉。

釋放方法:

deletedc(hsourcedc);

修改後的**:

//將bitmap繪製到dc上

hdc hdestdc = dc.getsafehdc();

hdc hsourcedc = ::createcompatibledc(hdestdc);

hbitmap hbitmap = null;

bitmap.gethbitmap(null, &hbitmap);

hgdiobj holdbitmap = selectobject(hsourcedc, hbitmap);

bitblt(hdestdc, pmiddlechunk->left, pmiddlechunk->top, pmiddlechunk->width, pmiddlechunk->height, hsourcedc, 0, 0, srccopy);

deleteobject(hbitmap);

deleteobject(holdbitmap);

deletedc(hsourcedc);

第3種 實在找不出,呼叫這個函式,中斷下

_crtbreakalloc = 495;  或

_crtsetbreakalloc(570);

{// 如果乙個執行在 windows xp 上的應用程式清單指定要

// 使用 comctl32.dll 版本 6 或更高版本來啟用視覺化方式,

//則需要 initcommoncontrols()。否則,將無法建立視窗。

initcommoncontrols();

_crtbreakalloc = 2413;

//_crtsetbreakalloc(570);

設定中斷點,這裡要注意,每次的中斷塊 不一定一樣,因為每次的執行環境都不一樣。

這裡要看中斷到這裡了,退出時,是不是中斷塊也是這裡。

有時候需要調好多次,才能找到**出問題了,有時候調了好多次,也沒找到,因為塊來回變。

Python記憶體洩漏和記憶體溢位的解決方案

一 記憶體洩漏 像j a程式一樣,雖然python本身也有垃圾 的功能,但是同樣也會產生記憶體洩漏的問題。對於乙個用 python 實現的,長期執行的後台服務程序來說,如果記憶體持續增長,那麼很可能是有了 記憶體洩露 1 記憶體洩露的原因 對於 python 這種支援垃圾 的語言來說,怎麼還會有記憶...

JVM記憶體洩漏與溢位以及解決方案

簡單地說就是申請了一塊記憶體空間,使用完畢後沒有釋放掉。它的一般表現方式是程式執行時間越長,占用記憶體越多,最終用盡全部記憶體,整個系統崩潰。由程式申請的一塊記憶體,且沒有任何乙個指標指向它,那麼這塊記憶體就洩露了。記憶體洩漏是造成應用程式oom的主要原因之一。我們知道android系統為每個應用程...

關於yii2框架中記憶體洩漏的解決方案

現象描述 命令列執行乙個7萬行的指令碼,迴圈裡進行各種查詢。結果每次都會報出記憶體溢位的錯誤,類似於這樣 第 475 次,消耗記憶體 312.68mb第 476 次,消耗記憶體 313.22mb第 477 次,消耗記憶體 313.79mb。還是報錯。記憶體溢位。allowed memory size...