最近寫一個項目時,發現有內存泄漏,經艱苦奮鬥,終於發現一個C++BUILDER 6(已打全部補丁)內存會泄漏的BUG,不敢私藏,寫出來供大家參考。這個BUG是由於try {} __finally {}語句不能正常工作造成的(編譯器系統級BUG)。可以打開任務管理器,使用下面的測試代碼驗證:
void __fastcall TMainForm::BtnTestClick(TObject *Sender)
{
char *Buffer = new char[1024*1024]; // 在這裏設置一個斷點
try
{
try
{
memset(Buffer, 0x00, 1024*1024); // 訪問申請到的內存
//throw Exception("Error!"); // 人爲產生異常
return; // 這裏返回會造成內存泄漏
}
catch(...)
{
return; // 異常出現時返回也會造成內存泄漏
}
//return; // 前面不返回,在這裏返回(或乾脆不返回)纔不會造成內存泄漏
}
__finally
{
delete []Buffer; // 在這裏設個斷點(內存泄漏時會執行不到)
}
}
結論:1、try{}__finally{}語句在第一個語句塊裏如果有try{}catch{}語句,如果產生異常或提前return,會造成內存泄漏。
結論:2、多個try{}__finally{}語句套用如果發生前面說的情況,每個__finally{}都不會執行,造成內存泄漏。
結論:3、在C++Builder 2007裏測試,不存在內存泄漏,無論怎麼返回,__finally{}都會得到執行(很好)。
(其它版本C++BUILDER,有興趣的朋友可以測試一下,估計6之前的版本都有)