type
TSomeRecord = Record
field1: integer;
field2: string;
field3: boolean;
End;
var
SomeRecord: TSomeRecord;
SomeRecAr: array of TSomeRecord;
Run Code Online (Sandbox Code Playgroud)
这是我所拥有的最基本的例子,因为我想重复使用SomeRecord(某些字段保持为空,没有释放所有字段将在重复使用时被转移SomeRecord,这显然是不受欢迎的)我正在寻找一种方法一次释放所有字段.我已经开始string[255]使用ZeroMemory(),这很好,直到它开始泄漏内存,这是因为我切换到string.我仍然缺乏了解原因的知识,但似乎与动态有关.我也在使用动态数组,因此我认为尝试ZeroMemory()任何动态都会导致泄漏.有一天浪费了这一点.我想,我通过使用解决了这个Finalize()上SomeRecord或SomeRecAr之前ZeroMemory(),但我不知道这是正确的做法,或只是我太傻了.
所以问题是:如何一次性解放所有东西?是否存在一些我不知道的单一程序?
换句话说,或者我会建议如何以不同的方式实现这些记录,所以我不需要做出复杂的尝试来释放东西.我已经研究过创建记录New()然后去掉它Dispose(),但我不知道当调用之后的变量Dispose()是未定义的而不是nil 时它意味着什么.另外,我不知道某个type(SomeRecord: TSomeRecord)的变量与指向type()的变量之间的区别是什么SomeRecord: ^TSomeRecord.我现在正在调查上述问题,除非有人能够快速解释,否则可能需要一些时间.
根据FastMM4,我正在研究的Delphi程序正在泄漏很多字符串.确切地说,AnsiStrings:

应用程序(http://sourceforge.net/projects/orwelldevcpp/)曾经泄漏了更多其他数据类型,但FastMM4可以报告实例的创建位置,因此我设法解决了这个问题.奇怪的是,FastMM4根本不报告这些泄漏的位置.
编辑:它似乎确实存在,看到修复的答案.无论如何,问题仍然存在:我在世界上如何泄漏这些东西?
所以,嗯,不幸的是,我不知道该寻找什么.我的意思是,如果这些东西超出范围,它们应该自动释放(即使它们在堆上)?
我确实设法通过随机评论跟踪一些泄漏事件并查看计数会发生什么.这是一个例子:
// simply passing it a constant creates a leak...
MainForm.UpdateSplash('Creating extra dialogs...');
procedure TMainForm.UpdateSplash(const text : AnsiString);
begin
if not devData.NoSplashScreen then // even if this branch is NOT taken
SplashForm.Statusbar.SimpleText := 'blablabla' + text;
end;
// And even if the function call itself is placed within a NOT taken branch!
Run Code Online (Sandbox Code Playgroud)
这是泄漏的另一个例子:
// Passing this constants produces leaks...
procedure TCodeInsList.AddItemByValues(const a, b, c: AnsiString;...);
var
assembleditem : PCodeIns;
begin
new(assembleditem);
assembleditem^.Caption:=a;
assembleditem^.Line:=b;
assembleditem^.Desc:=c; …Run Code Online (Sandbox Code Playgroud) 我在类的方法中使用由字符串,布尔值,整数,货币和其他记录数组组成的记录.我想以递归方式初始化基本类型的所有字段为空/假/零.默认情况下,Delphi似乎不这样做.是否有一种直接的方法来实现这一点,不涉及通过名称访问每个字段并手动设置它?
我有2条记录,如下所示:
TYPE
TRecord2= packed record
i2: Integer;
end;
TRecord1= packed record
i1: Integer;
R2: TRecord2;
end;
Run Code Online (Sandbox Code Playgroud)
.
我想将记录字段初始化为零,但我不想使用FillMemory,因此我声明了2个常量记录,我在其中初始化字段.
CONST
Record2c: TRecord2=
(
i2: 0;
);
Record1c: TRecord1=
(
i1: 0;
R2: Record2c; <------- error line
);
Run Code Online (Sandbox Code Playgroud)
但是,我无法将Record2c分配给R2字段.编译器说:E2029'('期望但标识符'Record2c'找到.
但这有效(如果我评论我有错误的行):
procedure test;
var Record1: TRecord1;
begin
Record1:= Record1c; // initialize variable by associating the constant to it
end
Run Code Online (Sandbox Code Playgroud)
那么,我如何初始化R2字段?