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