gpt4 book ai didi

delphi - 这里的观察者实现是否存在内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 15:41:20 26 4
gpt4 key购买 nike

也许我不太了解delphi,但是我想问你:

在此站点:http://blogs.teamb.com/joannacarter/2004/06/30/690我发现了一个基于iterface的观察者模式的实现。

执行 Attach 时,会调用以下内容:

procedure TSubject.Attach(Observer: IObserver);
begin
if fObservers = nil then
fObservers := TInterfaceList.Create;
fObservers.Add(AObserver);
Notify;
end;

在分离中它有代码

procedure TSubject.Detach(Observer: IObserver);
begin
if fObservers <> nil then
begin
fObservers.Remove(AObserver);
if fObservers.Count = 0 then
fObservers := nil;
end;
end;

应该是:

procedure TSubject.Detach(Observer: IObserver);
begin
if fObservers <> nil then
begin
fObservers.Remove(AObserver);
if fObservers.Count = 0 then begin
fObservers.Free;
fObservers := nil;
end;
end;
end;

最佳答案

不,不应该,因为正如 Bharat 所说,IInterface 会处理这个问题。请注意,在您引用的示例中,fObservers 被声明为 IInterfaceList。这是一个接口(interface)。 Delphi 中的接口(interface)变量类似于 C++ 中的智能指针,它们在赋值时自动调用 _Addref 和 _Release。

另一方面,如果 fObservers 被声明为 TInterfaceList,那么它将是一个对象,并且对象在赋值时不会执行任何特殊操作,因此调用 Free 是正确的。

关于delphi - 这里的观察者实现是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033070/

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