相关疑难解决方法(0)

如何在Delphi中正确释放包含各种类型的记录?

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()SomeRecordSomeRecAr之前ZeroMemory(),但我不知道这是正确的做法,或只是我太傻了.

所以问题是:如何一次性解放所有东西?是否存在一些我不知道的单一程序?

换句话说,或者我会建议如何以不同的方式实现这些记录,所以我不需要做出复杂的尝试来释放东西.我已经研究过创建记录New()然后去掉它Dispose(),但我不知道当调用之后的变量Dispose()是未定义的而不是nil 时它意味着什么.另外,我不知道某个type(SomeRecord: TSomeRecord)的变量与指向type()的变量之间的区别是什么SomeRecord: ^TSomeRecord.我现在正在调查上述问题,除非有人能够快速解释,否则可能需要一些时间.

delphi records

15
推荐指数
3
解决办法
1万
查看次数

Delphi应用程序泄漏AnsiStrings

根据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)

memory delphi string memory-leaks dev-c++

11
推荐指数
1
解决办法
3661
查看次数

如何初始化声明为局部变量的记录?

我在类的方法中使用由字符串,布尔值,整数,货币和其他记录数组组成的记录.我想以递归方式初始化基本类型的所有字段为空/假/零.默认情况下,Delphi似乎不这样做.是否有一种直接的方法来实现这一点,不涉及通过名称访问每个字段并手动设置它?

delphi

9
推荐指数
1
解决办法
6058
查看次数

记录在案(无法初始化)

我有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字段?

delphi

4
推荐指数
2
解决办法
2257
查看次数

标签 统计

delphi ×4

dev-c++ ×1

memory ×1

memory-leaks ×1

records ×1

string ×1