gpt4 book ai didi

delphi - 将视觉组件存储在动态数组中是否安全?

转载 作者:行者123 更新时间:2023-12-01 21:59:43 26 4
gpt4 key购买 nike

在delphi中,如果动态数组是引用计数的,那么将可视组件存储在数组中是否安全,就像引用计数器如何与可视组件一起工作一样?由于可视组件与常规非可视代码有很大不同,引用计数器是否会被欺骗......

我不知道delphi较新副本中的动态数组是否以引用计数以外的其他方式进行内存管理,例如在幕后以某种列表的形式实现。

最佳答案

这是绝对安全的。就实例变量的处理方式而言,可视组件与非可视组件实际上没有任何不同。

动态数组的引用计数可以简单地认为是数组的自动内存管理。请注意,我说的是“数组”。动态数组的引用计数并不意味着其元素的内存管理。

动态数组 TMyVisualComponent 的一个元素只是一个保存对象引用的变量。它与TMyVisualComponent类型的局部变量没有什么不同。或 TMyVisualComponent 类型的类的字段.

考虑以下两个示例:

type
TMyClass1 = class
private
FObj: TMyVisualComponent;
end;

TMyClass2 = class
private
FArr: TArray<TMyVisualComponent>;
end;

进入FObj放置对其生命周期在其他地方管理的实例的引用。同样进入FArr放置了对多个实例的引用,这些实例的生命周期在其他地方进行管理。

TMyClass1 的实例时被销毁, FObj 引用的实例没有任何反应。所发生的只是 TMyClass1 的实例被破坏,因为它包含变量 FObj ,那么该变量也被销毁。请注意,我说的是“变量”。变量FObj被销毁时,它所引用的对象不受影响。

同样,当TMyClass2的实例被破坏,数组FArr被销毁,但它所引用的对象没有任何反应。

最后一个问题是,在 ARC 编译器下,对类的所有引用都进行引用计数。所以我上面所说的需要修改为包括 TMyVisualComponent 实例的引用计数。但由于还有其他方引用了 TMyVisualComponent 的这些实例,那么他们就会一直活着。

总而言之,只需想想 TArray<TMyVisualComponent>无非就是 TMyVisualComponent 的多个变量定义在相同的范围内。

关于delphi - 将视觉组件存储在动态数组中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47468695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com