C++ Builder 5 和 6中VCL的一個記憶體洩漏 BUG (轉)

worldblog發表於2007-12-15
C++ Builder 5 和 6中VCL的一個記憶體洩漏 BUG (轉)[@more@]

版本:C++Builder 5 、6

:{C++Builder Path}/include/vcl/utilcls.h
行號:1039 (implemention of operator AnsiString() const)
行號:1065 (implemention of operator WString() const)
行號:1081 (implemention of operator wchar_t*() const)
  在上面三個運算子的實現裡,變數v分配的資源(字串)沒有被釋放,因為v是TBaseVariantT的變數,而TBaseVariantT只有constructor沒有destructor,所以v在constructor中分配的就丟失了。

  透過簡單的實驗可以檢測出來,寫一個包含事件的Server程式,並且事件介面中包含BSTR型別的引數,註冊後,在C++ Builder中用import type library引入,並且生成包裝類的component。然後建立一個簡單的程式,把包裝類的component放到程式的form上,並且實現component的事件函式(可以是空程式碼,但必須有這個函式)。比如:

void __fastcall MainForm::MyServerEvent1(BSTR msg)

{

// empty code

}

在自動生成的包裝類中,C++ Builder利用自動化介面每個事件函式,從原始檔中可以看到呼叫MyServerEvent1的程式碼類似如下:

if( OnMyServerEvent1 )

  OnMyServerEvent1( TVariant(params[0])  );

在這個語句中隱式的呼叫了operator wchar_t*() const,因此記憶體洩漏發生了。讓Server觸發事件足夠多的次數,記憶體洩漏就很明顯的表現出來,可以一直耗光記憶體。

解決辦法很簡單,稍微改動程式碼即可,別忘了先刪除lib目錄下的預編譯標頭檔案vcl60.csm(vcl50.csm),否則改動的程式碼不會重編譯。

雖然不確定,但是很可能需要重編譯VCL的庫,因為VCL中的程式碼中可能也有呼叫上面運算子的地方。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993788/,如需轉載,請註明出處,否則將追究法律責任。

相關文章