3

我想创建一个二维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,还是应该手动处理?

2) 如何处理对象的动态数组 ( matrix)?Free Pascal wiki 说分配nil给动态数组会释放指针指向的内存,但我认为它不会调用任何析构函数。

4

1 回答 1

3

1) 是的,如果您释放 TMyClass 实例,则 MyArray 将被释放,因为它的引用计数将降至零。一个例外情况是,如果您在代码的其他地方全局引用此数组,那么良好的代码设计不应该出现这种情况。数组中的实际对象不会被自动释放(继续阅读)。

2) 不,将数组大小调整为零、将其设置为 null 或使其引用计数为零不会自动释放您在其元素中引用的任何类。您需要自己完成,通过遍历 2D 数组并正确释放每个对象。

从文档中,“将 nil 分配给动态数组变量会自动释放指针指向的内存。”。这就是它所做的一切,所以它实际上不会触及你的类,只会释放分配给存储它们的引用(它们是指针)的内存。

参考。http://wiki.freepascal.org/DYNAMIC_ARRAY

于 2012-04-20T06:07:39.603 回答