我想创建一个 TMyClass
对象的二维数组,考虑到这些对象中的每一个都包含对 TMyClass
的引用数组,即
type
TMyClass = class
MyArray: array[0..10] of TMyClass;
constructor Create;
destructor Destroy;
end;
TMyMatrix = array of array of TMyClass;
var
matrix: TMyMatrix;
begin
SetLength(matrix, 10, 10);
(...) { matrix[i, j].Create; ? }
1) 在处理 TMyClass
对象时,引用数组 (MyArray
) 是否会自动处理(不影响实际对象),还是我应该手动处理它?
2) 如何处理对象的动态数组 (matrix
)? Free Pascal wiki 说将 nil
分配给动态数组会释放指针指向的内存,但我认为它不会调用任何析构函数。
最佳答案
1) 是的,如果您释放 TMyClass 实例,那么 MyArray 将被释放,因为它的引用计数将降为零。一个异常(exception)是如果您在代码的其他地方全局引用此数组,良好的代码设计不应发生这种情况。数组中的实际对象不会自动释放(继续阅读)。
2) 不,将数组大小调整为零、将其设置为空或使其引用计数为零将不会自动释放您在其元素中引用的任何类。您需要自己完成,遍历二维数组,并正确释放每个对象。
从文档中,“将 nil 分配给动态数组变量会自动释放指针指向的内存。”。这就是它所做的全部,因此它实际上不会触及您的类,只会释放分配给存储它们的引用(指针)的内存。
关于arrays - 在 Free Pascal 中处理对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237480/