我有一点问题。如标题所述,我想释放一个其类实现接口的对象,但是出现错误“无效的指针操作”。

我的界面:

Interface

Type
  // An interface definition
  IMessageEvents = Interface(IInterface)
    ['{BD27EFC6-CC9A-437A-A8B8-16F722518836}']

    Procedure messageReceived(messageData: String);
  End;

Implementation


我的课:

Type
  TChatManager = Class(TInterfacedObject, IMessageEvents)
  Private
  Protected
    Procedure messageReceived(messageData: String); Overload;
  Public
    Constructor Create; Overload;
    Destructor Destroy; Override;
    Procedure connect;
    Procedure disconnect;
  End;

Implementation

Constructor TChatManager.Create;
Begin
    { ....... }
End;

Procedure TChatManager.connect;
Begin
  { ....... }
End;

Procedure TChatManager.disconnect;
Begin
  { ....... }
End;

Procedure TChatManager.messageReceived(messageData: String);
Begin
  { ....... }
End;

Destructor TChatManager.Destroy;
Begin
  Inherited Destroy;
End;


我的代码:

 self.chatMng := TChatManager.Create;
 self.chatMng.Free;


谁能告诉我我在做什么错?提前致谢。

最佳答案

看来chatMngTChatManager类型。可以通过为您分配TChatManager.Create并在其上调用Free这一事实来推断。

但是,TChatManager是从TInterfacedObject派生的。这意味着其生存期由对其接口的引用控制。释放最终引用后,该对象将被销毁。

经验法则是,如果您从TInterfacedObject派生,则除通过接口变量外,绝不能引用该对象。

更正代码的步骤:


chatMng更改为IMessageEvents类型。
在任何情况下,都应删除对chatMng.Free的调用,编译器将反对该调用。

10-06 05:56