arrays - 在 Free Pascal 中处理对象数组

标签 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) 在处理 TMyClass 对象时,引用数组 (MyArray) 是否会自动处理(不影响实际对象),还是我应该手动处理它?

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

最佳答案

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

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

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

引用。 http://wiki.freepascal.org/DYNAMIC_ARRAY

关于arrays - 在 Free Pascal 中处理对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237480/

相关文章:

java - 在双数组中尝试并捕获未按我的预期工作

c - 如何在c中将一定长度的字符串放入二维数组中

C# 'using'语句题

c# - 将流包装在流中 - 包装后的流会被正确处理吗?

entity-framework - 延迟加载异常( Entity Framework )

javascript - 通过搜索某个值返回数组中的 Dictionary 对象

c# - 列表中的数组

javascript - 在 JavaScript 中将字符串拆分为任意维度的多维数组的最快方法?

swift - 访问存储在多维数组中的值

java - 如何将字符串文件读入二维数组