这里的观察者实现是否有内存泄漏?

时间:2010-10-27 12:20:26

标签: delphi design-patterns memory-leaks

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

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

进行连接时,会调用此方法:

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;

2 个答案:

答案 0 :(得分:6)

不,它不应该,因为正如巴拉特所说,IInterface会照顾到这一点。请注意,在您遇到的示例中,fObservers被声明为IInterfaceList。这是一个界面。 Delphi中的接口变量类似于C ++中的智能指针,它们在赋值时自动调用_Addref和_Release。

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

答案 1 :(得分:5)

无需添加fObservers.Free;语句。 IInterface将负责添加和发布fObservers

Delphi使用_AddRef and _Release来管理接口对象的生命周期。

当您为接口变量分配接口引用时,Delphi会自动调用_AddRef

当变量超出范围时,Delphi会自动调用_Release

有关详情,请浏览this link