gpt4 book ai didi

delphi - 无法释放接口(interface)实现的类

转载 作者:行者123 更新时间:2023-12-03 19:31:04 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How can free Interface implemented class?

(2 个回答)


8年前关闭。




之前开过一个类似的话题,但是没有明确的错误原因 “无效的指针操作”尝试释放类实例时。现在我已经知道原因了,所以我开一个新话题,把问题暴露出来。

所以这个错误的原因是在实例化类 ChatClient 并将类本身的实例 (TChatManager) 作为参数传递时。问题可能与 TChatManager 类对接口(interface)的实现有关。

接口(interface):

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

Procedure messageReceived(messageData: String);
End;

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

Implementation

Constructor TChatManager.Create;
Begin
Inherited Create;
self.cChatClient := TChatClient.Create(self); // self class instance as parameter
End;

Procedure TChatManager.messageReceived(messageData: String);
Begin

End;

Destructor TChatManager.Destroy;
Begin
Inherited Destroy;
End;

TChatClient 类:
Type
TChatClient = Class(TObject)
Private
iMsgEvents: IMessageEvents;
Protected
Public
Constructor Create(iMsgEvents: IMessageEvents); Overload;
Destructor Destroy; Override;
End;

Implementation

Constructor TChatClient.Create(iMsgEvents: IMessageEvents);
Begin
Inherited Create;
self.iMsgEvents := iMsgEvents;
End;

Destructor TChatClient.Destroy;
Begin
Inherited Destroy;
End;

主营:
cChatManager: TChatManager;
self.cChatManager := TChatManager.Create;
self.cChatManager.Free; // Failed

任何人都可以解释我正在实现的坏事吗?谢谢。

注意:类不完整,我删除了一些释放对象的方法等......

问候。

最佳答案

您的问题的答案是TInterfacedObject的以下方法:

procedure TInterfacedObject.BeforeDestruction;
begin
if RefCount <> 0 then
Error(reInvalidPtr);
end;

您的代码正在破坏 TChatManager实例具有非零 RefCount字段,因为它被 TChatClient 引用实例。

OP 代码无法修复,应重新设计,因为在当前形式中 TChatManager实例应在 TChatClient 中销毁析构函数(通过设置 iMsgEvents:= nil ),这很奇怪! :)

关于delphi - 无法释放接口(interface)实现的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20731532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com