我在这里创建了内存泄漏吗?

Ste*_*eve 7 delphi memory-leaks memory-management delphi-7

一个非常简单的问题:

type

TMyRecord = Record
  Int: Integer;
  Str: String;
end;

PMyRecord = ^TMyRecord;

var
  Data: PMyRecord;
begin
  New(Data);
  Data.Int := 42;
  Data.Str := 'Test';
  Dispose(Data);
end;
Run Code Online (Sandbox Code Playgroud)

我的问题是,我在这里创建了一个内存泄漏(有String)吗?我打电话Data.Str := '';之前应该打电话Dispose吗

谢谢!

him*_*elf 12

不,Dispose正确释放记录中的字符串和动态数组,包括嵌套的数组.GetMem/ FreeMem(Data)确实会造成内存泄漏.

  • 添加变体,引用计数接口甚至匿名函数到列表中,我认为引用计数的所有内容都在`Dispose()`上发布. (3认同)
  • @ldsanson:New = GetMem + Initialize和Dispose = Finalize + FreeMem - 检查System.pas.这些只是两个函数的包装. (3认同)
  • GetMem/FreeMem需要调用Finalize().检查帮助中的Finalize,了解无法使用Dispose()时的操作说明. (2认同)

Dav*_*nan 10

如果在allocate/deallocate对之间引发异常,则会发生内存泄漏.保护他们是正常的:

New(Data);
Try
  Data.Int := 42;
  Data.Str := 'Test';
Finally
  Dispose(Data);
End;
Run Code Online (Sandbox Code Playgroud)