Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中管理TObjectDictionary中的内存_Dictionary_Delphi - Fatal编程技术网

如何在Delphi中管理TObjectDictionary中的内存

如何在Delphi中管理TObjectDictionary中的内存,dictionary,delphi,Dictionary,Delphi,我想知道在Delphi中使用TObjectDictionary时如何正确管理内存 我想创建一个Tshape的ObjectDictionary,以便在一段时间内绘制圆,但每个圆的位置和数量都会发生变化 我不想内存泄漏。在on closeform中,我将执行FShapes.Free,但我不确定每次执行FShapes.Free时是否都执行FShapes.Clear 我已经读到我必须在OnValueNotify上做这件事,但我不知道如何做 private FShapes: TObjectDictiona

我想知道在Delphi中使用TObjectDictionary时如何正确管理内存

我想创建一个Tshape的ObjectDictionary,以便在一段时间内绘制圆,但每个圆的位置和数量都会发生变化

我不想内存泄漏。在on closeform中,我将执行FShapes.Free,但我不确定每次执行FShapes.Free时是否都执行FShapes.Clear

我已经读到我必须在OnValueNotify上做这件事,但我不知道如何做

private
FShapes: TObjectDictionary<Integer, TShape>;

procedure TFRemote_Layout.FormCreate(Sender: TObject);
begin
  FShapes := TObjectDictionary<Integer, TShape>.Create([doOwnsValues]);
  FShapes.OnValueNotify := VNotify;
end;

procedure TFRemote_Layout.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FShapes.Free;
end;

procedure TFRemote_Layout.InsertShape(i, x, y: Integer);
var
  AShape: TShape;
begin
  try
    AShape := TShape.Create(nil);
    AShape.Top := x;
    AShape.Left := y;
    FShapes.Add(i, AShape);
  finally
    //Free AShape??
  end;
end;

procedure TFRemote_Layout.ClearDictionary();
begin
  FShapes.Clear; //This clear frees all the memory for the next cycle?
end;


//I was reading in embarcadero something like this, but not sure 
procedure TFRemote_Layout.VNotify(Sender: TObject; const Item: TShape; Action: TCollectionNotification);
begin
 Item.Free;
end;
通过调用方法清除将从集合中删除所有项。然后,构造函数参数中给定的所有权指定移除项时是否释放键和/或值

在您拥有值的情况下,调用将释放所有包含的TShape对象,而不需要为事件提供任何附加的通知侦听器。

清除by calling方法将从集合中删除所有项。然后,构造函数参数中给定的所有权指定移除项时是否释放键和/或值


在您拥有值的情况下,调用将释放所有包含的TShape对象,而不需要为事件添加任何其他通知侦听器。

我知道这适用于.free,但不确定是否也适用于.clear。我认为这是正确的,但如果有疑问,如果您想测试类似的内容,只需创建一个简单的类,在其析构函数中显示消息。在对象字典中放入一两个实例,调用clear、delete、free等,看看会发生什么。据我所知,事件就在那里,因此您可以对添加或删除的项目进行响应,例如,如果您想更新UI进行响应。好的,非常感谢您的快速回答,有时我在内存管理方面遇到问题。测试这类问题的好技巧。我知道它可以与.free一起使用,但不确定它是否也可以与.clear一起使用。我认为这是正确的,但如果有疑问,如果您想测试类似的内容,只需创建一个简单的类,在其析构函数中显示消息。在对象字典中放入一两个实例,调用clear、delete、free等,看看会发生什么。据我所知,事件就在那里,因此您可以对添加或删除的项目进行响应,例如,如果您想更新UI进行响应。好的,非常感谢您的快速回答,有时我在内存管理方面遇到问题。测试这类问题的好方法。不要被该方法的文档所说的内容弄糊涂,Clear不会在项目被删除时释放它们。。这适用于TDictionary,而不适用于拥有键或值的TObjectDictionary,这是TDictionary和TObjectDictionary.P.S.之间的本质区别。不要被该方法的文档所说的内容弄糊涂,Clear不会在项目被删除时释放它们。。这适用于TDictionary,而不适用于拥有键或值的TObjectDictionary,这是TDictionary和TObjectDictionary之间的本质区别。