再發:發現一個 Delphi6 VCL 的 BUG!

上一次在csdn發失敗了,再試試看

句柄泄漏最終造成系統的網絡完全癱瘓!

下面是 Delphi6 VCL 標准類庫 Sockets 單元中 TBaseSocket 類的一段代碼:

procedure TBaseSocket.Close;

begin

if FActive then

begin

{$IFDEF LINUX}

ErrorCheck(Libc.__close(FSocket));

{$ENDIF}

FSocket := INVALID_SOCKET;

FActive := False;

DoDestroyHandle;

end;

end;

難道 Borland 的開發人員忘了在 {$IFDEF MSWINDOWS} 時也需要關閉句柄?這個 BUG 的後果就是句柄泄漏最終造成系統的網絡完全癱瘓!

此 BUG 在 Delphi2005 已經修改了,不知道 Delphi7 和 Delphi8 中有沒有被修改!

下面是 Delphi2005 的代碼:

procedure TBaseSocket.Close;

begin

if FActive then

begin

{$IFDEF MSWINDOWS}

ErrorCheck(closesocket(FSocket));

{$ENDIF}

{$IFDEF LINUX}

ErrorCheck(Libc.__close(FSocket));

{$ENDIF}

FSocket := INVALID_SOCKET;

FActive := False;

DoDestroyHandle;

end;

end;

使用 Delphi6 時就要注意了,所有從 TBaseSocket 繼承的類在 free 以前都要先把 Handle 記錄下來在 free 以後手動 closesocket

 
VCL中的一個內存泄漏Bug
摘要:VCL中的一個內存泄漏Bug在valedit.pas中,TValueListStrings類沒有實現虛擬的Destroy方法,它實現了虛擬的Clear方法, 但是它的父類TStringList的Destroy中並不通過調用Clear()來釋放資源,因此TValueListStrings中...查看完整版>>VCL中的一個內存泄漏Bug
 
VCL 中的一個內存泄漏 Bug
在valedit.pas中,TValueListStrings類沒有實現虛擬的Destroy方法,它實現了虛擬的Clear方法, 但是它的父類TStringList的Destroy中並不通過調用Clear()來釋放資源,因此TValueListStrings中爲成員ItemProps分配的內存就...查看完整版>>VCL 中的一個內存泄漏 Bug
 
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 WideString() const)行號:1081 (implement...查看完整版>>C++ Builder 5 和 6中VCL的一個內存泄漏 BUG
 
使用TCPMP發現的一個BUG
本人剛加入智能手機軍團不久,在使用TCPMP過程,發現了點問題,有時候會出現TCPMP崩潰的現象,開始我就刪了,再換個版本~~後來發現其實解決這個問題很簡單。 它崩潰的時候會提示:意外故障!請向此程序作者發送“cr...查看完整版>>使用TCPMP發現的一個BUG
 
用next_permutation()生成r-組合數,兼發現VC7的一個bug
C++ standard library提供了兩個生成排列的algorithms:next_permutation()與prev_permutation(),卻沒有提供生成組合數的標准函數。 由于排列與組合之間有著密切的聯系,我們很容易就可以從“排列”獲得“組合”...查看完整版>>用next_permutation()生成r-組合數,兼發現VC7的一個bug