gpt4 book ai didi

delphi - Delphi 中的悬空指针

转载 作者:行者123 更新时间:2023-12-03 06:13:41 24 4
gpt4 key购买 nike

我没有使用接口(interface)(因此对象没有引用计数)。这些对象可能被许多其他对象引用,我需要处理悬空指针。 FreeAndNil() 不能解决多个引用的问题。我需要当一个对象被销毁时,引用它的所有指针都会自动设置为 nil。或者,它可能类似于 C++ 中 std::weak_ptr 的 Expired() 方法。

我可以实现一个“弱智能指针”来做到这一点,但我不确定它是否是一个过于复杂的实现。您建议另一种解决方案吗?这是我正在考虑的未经测试的可能解决方案:

type
TWeakReferenceable = class
constructor Create();
destructor Destroy(); override; //Set ReferencedObject:=nil for all the weak references in FWeakReferenceList
private
FWeakReferenceList: TList; //List of weak references to this object
protected
procedure RegisterWeakReference(const AWeakReference: TWeakReference<TWeakReferenceable>); //Adds a weak reference
procedure UnregisterWeakReference(const AWeakReference: TWeakReference<TWeakReferenceable>); //Removes a weak reference
end;

type
TWeakReference<TObjectType: TWeakReferenceable> = class
constructor Create();
destructor Destroy(); override; //Destroys the object and calls UnregisterWeakReference(self) for the referenced object
private
FObjectReference: TObjectType;
procedure SetReference(AReferencedObject: TObjectType); //Calls UnregisterWeakReference(self) for the current reference, updates FObjectReference and calls RegisterWeakReference(self) for the referenced object
public
property ReferencedObject: TObjectType read FObjectReference write SetReference;
end;

最佳答案

对于移动平台,Delphi 对对象使用 ARC(自动引用计数),编译器有一个 [weak] 属性,用于声明一个弱指针,当引用的对象被释放时,该指针会自动为零。

对于桌面平台,Delphi 不使用 ARC 来处理对象。然而,TComponent 有自己的处理“弱”引用的机制 - 它的 FreeNotification() 方法。当一个组件对另一个组件的生命周期感兴趣时,它必须调用另一个组件的 FreeNotification() 方法。 TComponent 维护感兴趣组件的内部列表。当释放 TComponent 对象时,它会调用那些感兴趣的组件的 Notification() 方法,以便它们可以将对被释放组件的引用置零。

不过,您显示的代码没有使用TComponent。因此,您必须创建自己的注册/通知系统来消除对已释放对象的引用。

关于delphi - Delphi 中的悬空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325943/

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