內存泄漏之一,看到的是你想不到的。(C++Builder 6)

最近寫一個項目時,發現有內存泄漏,經艱苦奮鬥,終於發現一個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之前的版本都有)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章