2012-04-19 51 views
3

我想创建TMyClass对象的二维数组,考虑到每个对象包含TMyClass引用数组,即处置对象数组中的Free Pascal

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对象时,自动处理引用数组()(不影响实际对象),还是应该手动处理?

2)如何配置物体的动态数组(matrix)?免费的帕斯卡维基说,将nil分配给动态数组可以释放指针指向的内存,但我认为它不会调用任何析构函数。

回答

3

1)是的,如果您释放TMyClass实例,则MyArray将被释放,因为其引用计数将降为零。这是一个例外,如果你在代码的其他地方全局引用这个数组,这不应该发生在良好的代码设计中。数组中的实际对象不会自动释放(读取)。

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

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

Ref。 http://wiki.freepascal.org/DYNAMIC_ARRAY

+1

请注意,您可以通过使用适当的容器来获得内存管理效果,例如,当'FreeObjects'构造函数参数为true时'TFPGObjectList'。 – lukstafi 2012-04-20 15:05:33