| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網網民  2006-01-31 22:16:13  評論

上一次在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

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
上一次在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
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有