non*_*one 3 delphi memory-leaks design-patterns
也许我不太了解德尔福,但是我想问你:
在这个网站: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;
Run Code Online (Sandbox Code Playgroud)
在分离中它有代码
procedure TSubject.Detach(Observer: IObserver);
begin
if fObservers <> nil then
begin
fObservers.Remove(AObserver);
if fObservers.Count = 0 then
fObservers := nil;
end;
end;
Run Code Online (Sandbox Code Playgroud)
它应该是:
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;
Run Code Online (Sandbox Code Playgroud)
不,它不应该,因为正如巴拉特所说,IInterface将负责这一点.请注意,在您遇到的示例中,fObservers被声明为IInterfaceList.这是一个界面.Delphi中的接口变量类似于C++中的智能指针,它们在赋值时自动调用_Addref和_Release.
另一方面,如果fObservers被声明为TInterfaceList,那么它将是一个对象,并且对象在赋值时不做任何特殊操作,因此调用Free是正确的.
没有必要添加fObservers.Free;语句.IInterface将负责添加和释放fObservers.
Delphi用于_AddRef and _Release管理接口对象的生命周期.
当您为接口变量分配接口引用时,Delphi会自动调用_AddRef.
当变量超出范围时,Delphi会自动调用_Release.
欲了解更多信息,请浏览此链接.
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |