我想创建一个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)在处置MyArray
对象时,是否会自动处理引用数组(TMyClass
)(不影响实际对象),还是应该手动处理它?</ p>
2)如何处理动态对象数组(matrix
)?免费的Pascal wiki说,将nil
赋值给动态数组会释放指针所指向的内存,但我认为它不会调用任何析构函数。
答案 0 :(得分:3)
1)是的,如果释放TMyClass实例,则将释放MyArray,因为其引用计数将降至零。例外情况是,如果您在代码中的其他位置全局引用此数组,则不应该使用良好的代码设计。数组中的实际对象不会自动释放(读取)。
2)否,将数组大小调整为零,将其设置为null或使其引用计数为零将不自动释放您在其元素中引用的任何类。您需要自己完成,通过遍历2D数组,并正确释放每个对象。
从文档中,“将nil分配给动态数组变量会自动释放指针所指向的内存。”它就是这样,所以它实际上不会触及你的类,只释放分配给存储它们的引用的内存(它们是指针)。