Delphi中的TSocketTransport类中内存泄漏BUG
TSocketTransport.SetConnected
if GetConnected = Value then Exit;
if Value then
begin
if (FAddress = '') and (FHost = '') then raise ESocketConnectionError.CreateRes(@SNoAddress);
FClientSocket := TClientSocket.Create(nil);
FClientSocket := TClientSocket.Create(nil); //此处创建的ClientSocket
FClientSocket.ClientType := ctBlocking;
FSocket := FClientSocket.Socket;
FClientSocket.Port := FPort;
if FAddress <> '' then
FClientSocket.Address := FAddress else
FClientSocket.Host := FHost;
FClientSocket.Open; //如果在此处抛出弃常的话不会被释放(TSocketTransport的Destroy过程中也没有释放的代码)
FClientSocket.Free;
end else
begin
if FSocket <> nil then FSocket.Close;
FSocket := nil;
FreeAndNil(FClientSocket); //只有此处才有释放的代码,但连接失败后根本就不会运行至此处
if FEvent <> 0 then WSACloseEvent(FEvent);
FEvent := 0;
end;
TSocketTransport.SetConnected
if GetConnected = Value then Exit;
if Value then
begin
if (FAddress = '') and (FHost = '') then raise ESocketConnectionError.CreateRes(@SNoAddress);
FClientSocket := TClientSocket.Create(nil);
FClientSocket := TClientSocket.Create(nil); //此处创建的ClientSocket
FClientSocket.ClientType := ctBlocking;
FSocket := FClientSocket.Socket;
FClientSocket.Port := FPort;
if FAddress <> '' then
FClientSocket.Address := FAddress else
FClientSocket.Host := FHost;
FClientSocket.Open; //如果在此处抛出弃常的话不会被释放(TSocketTransport的Destroy过程中也没有释放的代码)
FClientSocket.Free;
end else
begin
if FSocket <> nil then FSocket.Close;
FSocket := nil;
FreeAndNil(FClientSocket); //只有此处才有释放的代码,但连接失败后根本就不会运行至此处
if FEvent <> 0 then WSACloseEvent(FEvent);
FEvent := 0;
end;
解决方案 »
- 为什么我的dxDBCurrencyEdit.text不能赋值?
- fastreport 4.0 在masterdata的onbeforepaint 时间里调用 fileexits函数失败的原因?
- ☆☆☆☆☆☆☆毕业1.5年,上班1.5年,写程序1.5年,明年是本命年也是我女朋友的本命年,所以不愿意四处乱窜了……
- 获取ip地址和MAC地址
- 有关SOCKET问题
- 今天我过生日, 散分
- 删除记录的问题
- (已知本机IP地址)如何检测局域网上某个IP地址上是否存在计算机
- 关于报表要输出的字段太多的问题....
- [愿出100分]请高手帮忙解决关于修改EXE程序界面上调用文字"的问题!!!!!!!
- 怎样获得网络连接名称如“本地连接1“、“本地连接2”的本地连接号?
- delphi应该在哪个位置声明API?
if GetConnected = Value then Exit;
if Value then
begin
if (FAddress = '') and (FHost = '') then raise ESocketConnectionError.CreateRes(@SNoAddress);
FClientSocket := TClientSocket.Create(nil);
FClientSocket := TClientSocket.Create(nil); //此处创建的ClientSocket
FClientSocket.ClientType := ctBlocking;
FSocket := FClientSocket.Socket;
FClientSocket.Port := FPort;
if FAddress <> '' then
FClientSocket.Address := FAddress else
FClientSocket.Host := FHost;
FClientSocket.Open; //如果在此处抛出弃常的话不会被释放(TSocketTransport的Destroy过程中也没有释放的代码)
//FClientSocket.Free;此行不是库代码,本人不小心拷错
end else
begin
if FSocket <> nil then FSocket.Close;
FSocket := nil;
FreeAndNil(FClientSocket); //只有此处才有释放的代码,但连接失败后根本就不会运行至此处
if FEvent <> 0 then WSACloseEvent(FEvent);
FEvent := 0;
end;
begin
if GetConnected = Value then Exit;
if Value then
begin
if (FAddress = '') and (FHost = '') then
raise ESocketConnectionError.CreateRes(@SNoAddress);
FClientSocket := TClientSocket.Create(nil);
try
FClientSocket.ClientType := ctBlocking;
FSocket := FClientSocket.Socket;
FClientSocket.Port := FPort;
if FAddress <> '' then
FClientSocket.Address := FAddress else
FClientSocket.Host := FHost;
FClientSocket.Open;
except
FClientSocket.Free;
raise;
end;
end else
begin
if FSocket <> nil then FSocket.Close;
FSocket := nil;
FreeAndNil(FClientSocket);
if FEvent <> 0 then WSACloseEvent(FEvent);
FEvent := 0;
end;
end;
FClientSocket同一个类成员,如果Open之后发生异常,那么将在下一次Connected的状态改变的时候执行后else的代码.
包括Destroydestructor TSocketTransport.Destroy;
begin
FInterceptor := nil;
SetConnected(False);
inherited Destroy;
end;
FClientSocket := TClientSocket.Create(nil);
和
FreeAndNil(FClientSocket);
设置断点,然后把
FClientSocket.Open;
替换成一个:
Raise Exception.Create('Test Exception');
试运行一下看.
Destroy中的调用SetConnected(false)没有意义
if GetConnected = Value then Exit; //从这里这就退出了
因为根本没有连接成功
这Bug是FastMM检测出来内存泄漏,
我顺势而找到的。
但你几乎都是在质疑我的问题,
却没有帮我解决过实质上的问题。
你们所说的方法我几乎都试过了,我也不至于无聊到未确认就来嚷嚷。
正是这些方法证明了它确实是一个BUG。
如果你们有什么问题可以自己去测试。
也许只有自己得到的结果才是最容易让自己相信的。
不知道为什么,SConnect单元的代码写的很粗造,
仅这个单元就有不下10个的Bug。