相关代码:
TDataSocketCom = class (TComponent)
private
fMessageAgent : TMessageAgent;
...
pulic
...
constructor Create(AOwner: TComponent) ; override;
destructor Destroy; override;
end;constructor TDataSocketCom.Create(AOwner: TComponent);
begin
inherited;
fMessageAgent := TMessageAgent(Self);
end;
destructor TDataSocketCom.Destroy;
begin
fMessageAgent.Free ; inherited Destroy;
end;
TDataSocketCom = class (TComponent)
private
fMessageAgent : TMessageAgent;
...
pulic
...
constructor Create(AOwner: TComponent) ; override;
destructor Destroy; override;
end;constructor TDataSocketCom.Create(AOwner: TComponent);
begin
inherited;
fMessageAgent := TMessageAgent(Self);
end;
destructor TDataSocketCom.Destroy;
begin
fMessageAgent.Free ; inherited Destroy;
end;
解决方案 »
- 简单问题求解
- 消息传递中的奇怪问题急急急!!!
- 为什么我的delphi报表在运行时窗体上不显示caption内容
- 请教高手:在ADOConnection里,Provider属性你们都怎么选啊?
- 如何实现想ACDSee一样的图片拖动的功能
- 求救於各位高手:關於COM口的通訊問題(怎樣讀取卡鐘上的數據)這個東東搞不定,我就失業了,500分高分全給你們......
- 求矩阵的逆矩阵的算法???????
- 谢谢chons(琼(不再犹豫))
- 请问各位俄罗斯方块应该怎么写?
- fldARRAY这条语句为什么编译错误
- 三○○分相求一个往ACCESS数据库里面写图片文件或DOC文档的列子!(急)
- 高分求救:bde连接sql7为什么有时必须先要用网上邻居连接一次服务器才行
destructor TDataSocketCom.Destroy;
begin
inherited Destroy;
end;或者这样:constructor TDataSocketCom.Create(AOwner: TComponent);
begin
inherited;
fMessageAgent := TMessageAgent.Create(Self);
end;
begin
inherited;
fMessageAgent := TMessageAgent.create(Self);
end;
如果
destructor TDataSocketCom.Destroy;
begin
inherited Destroy;
end;
那么,fMessageAgent何时释放??
***********************************************
to cg1120:
没有直接调用Destroy,Free时自动调用的阿。
***********************************************
to outer2000:
和我的代码没有不同阿??
应该是overload吧。
destructor TDataSocketCom.Destroy;
begin
inherited;
fMessageAgent.Free ;
end;
TDataSocketCom = class (TComponent)
private
fMessageAgent : TMessageAgent;
...
pulic
...
constructor Create(AOwner: TComponent) ; override;
destructor Destroy; override;
end;constructor TDataSocketCom.Create(AOwner: TComponent);
begin
inherited;
fMessageAgent := TMessageAgent(Self);
end;
destructor TDataSocketCom.Destroy;
begin
fMessageAgent.Free ;
inherited;
end;
由于你在建构函数中,有此代码:
fMessageAgent := TMessageAgent(Self);
所以fMessageAgent就是TDataSocketCom自己啊,所以,如果在析构函数在加上fMessageAgent.free,就变成了一个递归的,无出口的调用,最终导致堆栈溢出或者非法内存操作。
fMessageAgent由于就是TDataSocketCom本身,所以同时释放。哈哈。
而
fMessageAgent := TMessageAgent.Create(Self);则根本不同,它创建了一个对象,所以可以在析构函数中释放。
constructor TDataSocketCom.Create(AOwner: TComponent);
begin
inherited;
fMessageAgent := TMessageAgent(Self);<<-
end;
应该是:
fMessageAgent := TMessageAgent.create(Self);还是 outer2000 一眼看出,高!