C++ Builder 5 和 6中VCL的一個記憶體洩漏 BUG (轉)
版本: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VCL 中的一個記憶體洩漏 Bug (轉)記憶體
- 分析記憶體洩漏和goroutine洩漏記憶體Go
- C++Builder 記憶體洩漏檢查工具-CodeGuard (轉)C++UI記憶體
- 【轉】Java的記憶體洩漏Java記憶體
- 【轉】java中的記憶體溢位和記憶體洩漏Java記憶體溢位
- 記憶體洩漏和記憶體溢位記憶體溢位
- Perfdog 玩轉記憶體洩漏記憶體
- 記憶體洩漏記憶體
- Swift的ARC和記憶體洩漏Swift記憶體
- 記憶體洩漏的原因記憶體
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- C++ 程式記憶體洩漏檢測方法C++記憶體
- C/C++記憶體洩漏及檢測C++記憶體
- 來了解一下記憶體溢位和記憶體洩漏記憶體溢位
- 處理記憶體洩漏的一種MFC方法 (轉)記憶體
- js記憶體洩漏JS記憶體
- Java記憶體洩漏Java記憶體
- webView 記憶體洩漏WebView記憶體
- Javascript記憶體洩漏JavaScript記憶體
- 記憶體洩漏-原因、避免和定位記憶體
- 1.記憶體優化(一)記憶體洩漏記憶體優化
- java記憶體溢位和記憶體洩漏的區別Java記憶體溢位
- 使用Microsoft Visual C++來檢測和隔離記憶體洩漏 (轉)ROSC++記憶體
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- 檢測並排除記憶體洩漏 (轉)記憶體
- C++記憶體洩露檢查的5個方法C++記憶體洩露
- WebView引起的記憶體洩漏WebView記憶體
- ARC下的記憶體洩漏記憶體
- JavaScript中的垃圾回收和記憶體洩漏JavaScript記憶體
- 記一次 Ruby 記憶體洩漏的排查和修復記憶體
- 記憶體分析與記憶體洩漏定位記憶體
- valgrind 記憶體洩漏分析記憶體
- Android 記憶體洩漏Android記憶體
- Android記憶體洩漏Android記憶體
- 淺談記憶體洩漏記憶體
- JavaScript 記憶體洩漏教程JavaScript記憶體
- 說說 記憶體洩漏記憶體
- 一次 Java 記憶體洩漏的排查Java記憶體