使用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...