我有一点问题。如标题所述,我想释放一个其类实现接口的对象,但是出现错误“无效的指针操作”。
我的界面:
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;
谁能告诉我我在做什么错?提前致谢。
最佳答案
看来chatMng
是TChatManager
类型。可以通过为您分配TChatManager.Create
并在其上调用Free
这一事实来推断。
但是,TChatManager
是从TInterfacedObject
派生的。这意味着其生存期由对其接口的引用控制。释放最终引用后,该对象将被销毁。
经验法则是,如果您从TInterfacedObject
派生,则除通过接口变量外,绝不能引用该对象。
更正代码的步骤:
将chatMng
更改为IMessageEvents
类型。
在任何情况下,都应删除对chatMng.Free
的调用,编译器将反对该调用。