在Free Pascal中处理对象数组

时间:2012-04-19 22:02:42

标签: arrays multidimensional-array dispose freepascal

我想创建一个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赋值给动态数组会释放指针所指向的内存,但我认为它不会调用任何析构函数。

1 个答案:

答案 0 :(得分:3)

1)是的,如果释放TMyClass实例,则将释放MyArray,因为其引用计数将降至零。例外情况是,如果您在代码中的其他位置全局引用此数组,则不应该使用良好的代码设计。数组中的实际对象不会自动释放(读取)。

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

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

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