gpt4 book ai didi

delphi - 为静态数组中的记录正确分配/释放内存

转载 作者:行者123 更新时间:2023-12-03 15:45:04 25 4
gpt4 key购买 nike

昨天我发生了一些内存损坏,我非常怀疑一些记录数组是如何分配和释放的。这是演示的简短版本:

type
TMyRecord = record
W: word;
S: String;
end;

TMyRecordArray = array [1 .. 315] of TMyRecord;
TArrayPointer = ^TMyRecordArray;

var
PageBase: TArrayPointer;

procedure TTestForm.FormCreate(Sender: TObject);
var
iRecord: TMyRecord;
begin
PageBase := AllocMem(SizeOf(TMyRecordArray));
iRecord.W := 1;
iRecord.S := 'TEST';
PageBase^[1] := iRecord;
end;

procedure TTestForm.FormDestroy(Sender: TObject);
begin
PageBase^[1] := Default (TMyRecord);
FreeMem(TPageBase);
end;

我相当确定我做得不对,任何建议将不胜感激。

最佳答案

首先要说的是,您提供的代码是有效的。它正确地完成和解除分配而不会泄漏。所以我会尝试更笼统地回答你的问题。

字符串是托管类型,编译器需要使用特殊的内存分配例程才能管理它们:NewDispose

分配

New(PageBase);

并解除分配:

Dispose(PageBase);

New 的调用可确保所有受管理的成员均默认初始化。另一方面,Dispose 将最终确定所有托管成员。

您可以在代码尝试时手动执行此操作。但在实际代码中,您需要最终确定数组的每个元素。您的代码仅完成一个。当然,它也只初始化一个,正如问题中所写的那样,这很好。也许您的问题的简短版本已经简化,因此错误已被消除。

但是,我当然不建议您手动处理托管类型。为此,请使用 NewDispose

还值得一提的是,动态数组在这里会简单得多。使用动态数组将使编译器负责所有分配和释放,并正确处理任何托管类型。

关于delphi - 为静态数组中的记录正确分配/释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com