Delphi内存泄漏,指向TStringList
发布时间:2020-12-15 09:43:16 所属栏目:大数据 来源:网络整理
导读:我在理解指针的行为方面遇到了一些麻烦. 我有一个非常简单的例子来证明: type PSL = ^TStringList;...var myPSL : PSL;...procedure TForm1.FormCreate(Sender: TObject);begin New(myPSL); myPSL^ := TStringList.Create; myPSL^.Add('String 1'); myPSL^.
我在理解指针的行为方面遇到了一些麻烦.
我有一个非常简单的例子来证明: 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; 有了这段代码,我得到了这个内存泄漏报告 29 - 36 bytes: UnicodeString x 3 37 - 44 bytes: Unknown x 1 85 - 92 bytes: TStringList x 1 现在,如果我打电话 myPSL^.Free; 在处理指针之前,没有报告任何内容. 我不明白为什么会这样.我知道调用New()分配足够的内存(基于指针的类型)并调用Dispose()负责释放相同的内存,那么为什么我需要释放指针,好像它是一个“真正的”对象? 谢谢! 解决方法
类对象已被指针引用.定义指向引用类型的指针毫无意义.只需直接使用该类型:
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; 您的代码实际执行的操作如下: 新的(myPSL)和Dispose(myPSL)只是分配/解除分配大小为(TStringList)字节的内存块,但实际上并不构造/破坏该内存中的TStringList对象.你需要调用myPSL:= TStringList.Create和myPSL.Free. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |