tsm*_*smr 4 delphi pointers memory-leaks
我在理解指针的行为方面遇到了一些麻烦.我有一个非常简单的例子来证明:
type
PSL = ^TStringList;
...
var
myPSL : PSL;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
New(myPSL);
myPSL^ := TStringList.Create;
myPSL^.Add('String 1');
myPSL^.Add('String 2');
myPSL^.Add('String 3');
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
Dispose(myPSL);
end;
Run Code Online (Sandbox Code Playgroud)
有了这段代码,我得到了这个内存泄漏报告
29 - 36 bytes: UnicodeString x 3
37 - 44 bytes: Unknown x 1
85 - 92 bytes: TStringList x 1
Run Code Online (Sandbox Code Playgroud)
现在,如果我打电话
myPSL^.Free;
Run Code Online (Sandbox Code Playgroud)
在处理指针之前,没有报告任何内容.
我不明白为什么会这样.我知道调用New()分配足够的内存(基于指针的类型)并调用Dispose()负责释放相同的内存,那么为什么我需要释放指针,好像它是一个"真正的"对象?
谢谢!
Dal*_*kar 12
类对象已被指针引用.定义指向引用类型的指针毫无意义.只需直接使用该类型:
var
myPSL : TStringList;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
myPSL := TStringList.Create;
myPSL.Add('String 1');
myPSL.Add('String 2');
myPSL.Add('String 3');
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
myPSL.Free;
end;
Run Code Online (Sandbox Code Playgroud)
您的代码实际执行的操作如下:
New(myPSL)并且Dispose(myPSL)只是分配/取消分配sizeof(TStringList)大小为字节的内存块,但实际上并不构造/破坏该TStringList内存中的对象.您需要调用myPSL := TStringList.Create,并myPSL.Free为替代.
你不需要存储指针TStringList,实例TStringList也是指针.要解决此问题,请将类型更改为myPSL以下内容:
var
myPSL : TStringList;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
myPSL := TStringList.Create;
myPSL.Add('String 1');
myPSL.Add('String 2');
myPSL.Add('String 3');
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
myPSL.Free;
end;
Run Code Online (Sandbox Code Playgroud)
如果以某种方式,您仍然需要使用旧代码,以避免内存泄漏,您需要Free在处置之前调用myPSL:
myPSL^.Free;
dispose(myPSL);
Run Code Online (Sandbox Code Playgroud)