相关代码:
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;

解决方案 »

  1.   

    代码有错误,应该这样:
    destructor TDataSocketCom.Destroy;
    begin
      inherited Destroy;
    end;或者这样:constructor TDataSocketCom.Create(AOwner: TComponent);
    begin
      inherited;
      fMessageAgent := TMessageAgent.Create(Self);
    end;
      

  2.   

    调用Free的时间不用调用Destroy了,因为它会自动调用父类的Destroy
      

  3.   

    constructor TDataSocketCom.Create(AOwner: TComponent);
    begin
      inherited;
      fMessageAgent := TMessageAgent.create(Self);
    end;
      

  4.   

    to chechy(简简单单的活):
    如果
    destructor TDataSocketCom.Destroy;
    begin
      inherited Destroy;
    end;
    那么,fMessageAgent何时释放??
    ***********************************************
    to cg1120:
    没有直接调用Destroy,Free时自动调用的阿。
    ***********************************************
    to outer2000:
    和我的代码没有不同阿??
      

  5.   

    constructor Create(AOwner: TComponent) ; override;
    应该是overload吧。
    destructor TDataSocketCom.Destroy;
    begin
      inherited;
      fMessageAgent.Free ;
    end;
      

  6.   

    这样试试:
    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;
      

  7.   

    to  SDT:
    由于你在建构函数中,有此代码:
    fMessageAgent := TMessageAgent(Self);
    所以fMessageAgent就是TDataSocketCom自己啊,所以,如果在析构函数在加上fMessageAgent.free,就变成了一个递归的,无出口的调用,最终导致堆栈溢出或者非法内存操作。
    fMessageAgent由于就是TDataSocketCom本身,所以同时释放。哈哈。

    fMessageAgent := TMessageAgent.Create(Self);则根本不同,它创建了一个对象,所以可以在析构函数中释放。
      

  8.   

    呵呵,问题解决,是个低级错误,粗心大意:
    constructor TDataSocketCom.Create(AOwner: TComponent);
    begin
      inherited;
      fMessageAgent := TMessageAgent(Self);<<-
    end;
    应该是:
    fMessageAgent := TMessageAgent.create(Self);还是  outer2000 一眼看出,高!