内存泄漏Tdelegated比较器

use*_*184 1 delphi

我正在用delphi编写一个通用的图形库.

下面的代码显示了TGraph和Tvertex的实现

///  TGRAPH ....
constructor TGraph<Tdata>.Create( ...);
begin
  // the graph owns its vertices - by freeing of the graph one frees the vertex list!
  _vertices := TObjectList < TVertex < Tdata >>
    .Create(TVertex<Tdata>.createVertexComparer(), true);

  _edges := TObjectList < TEdge < Tdata >>
    .Create(TEdge<Tdata>.createEdgeComparer(), true); 
end;

// destroy the graph and all its elemenst!
destructor TGraph<Tdata>.Free;

begin
  _edges.Free;
  _vertices.Free;
end;


/// Tvertex ......
class function TVertex<T>.createVertexComparer(): IComparer<TVertex<T>>;
begin
  Result := TDelegatedComparer < TVertex < T >>.Create(
    function(const Left, Right: TVertex<T>): Integer
    begin
      Result := Left.Compare(Right);
    end);

end;

constructor TVertex<T>.Create(withID: Integer);
begin
  F_neighbours := TObjectList < TVertex < T >>
    .Create(TVertex<T>.createVertexComparer(), true);
  vertex_id := withID;
end;

function TVertex<T>.Compare(const v: TVertex<T>): Integer;
begin
  Result := (self.fId - v.vertex_id);
end;

destructor TVertex<T>.Free;
begin
  F_neighbours.Free;
  // F_neighbours := nil;
  FreeAndNil(Fdata);
end;
Run Code Online (Sandbox Code Playgroud)

如果我运行代码,我会发现FastMM4的内存泄漏报告,如屏幕转储中所示.我无法理解为什么TdelegatedComparer漏了?

在此输入图像描述

Rem*_*eau 6

析构函数TGraph.Free;

析构函数TVertex.Free;

正确的析构函数名称是Destroy,它必须声明为,override因为它virtualTObject:

type
  TGraph<T> = class(...)
  ...
  public
    ...
    destructor Destroy; override;
  end;

destructor TGraph<T>.Destroy;
begin
  _edges.Free;
  _vertices.Free;
  inherited; // <-- and don't forget this
end;
Run Code Online (Sandbox Code Playgroud)

type
  TVertex<T> = class(...)
    ...
  public
    ...
    destructor Destroy; override;
  end;

destructor TVertex<T>.Destroy;
begin
  F_neighbours.Free;
  // F_neighbours := nil;
  FreeAndNil(Fdata);
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)