从查看system.pas,我可以找到一个-4字节的数组长度字段,以及-8字节的引用计数,但我似乎无法找到对其他的任何引用8.任何人都知道他们做了什么?
示例程序:
program Project1;{$APPTYPE CONSolE}type TDynArray = array of integer; TLotsOfArrays = array[1..1000000] of TDynArray; PLotsOfArrays = ^TLotsOfArrays;procedure allocateArrays;var arrays: PLotsOfArrays; i: integer;begin new(arrays); for I := 1 to 1000000 do setLength(arrays^[i],1);end;begin readln; allocateArrays; readln;end.解决方法 我也看了一下System.pas并注意到_DynArraycopyRange中的GetMem调用支持你的分析:
allocated size = count * element size
+ 2 * Sizeof(Longint)
.因此,从任务管理器获得的数字可能不是很准确.您可以尝试使用Pointer(someDynArray):= nil并检查FastMM报告的内存泄漏大小,以获得更可靠的数字.
编辑:我做了一个小测试程序:
program DynArrayLeak;{$APPTYPE CONSolE}uses SysUtils;procedure Test;var arr: array of Integer; i: Integer;begin for i := 1 to 6 do begin SetLength(arr,i); Pointer(arr) := nil; end;end;begin ReportMemoryLeaksOnShutdown := True; Test;end.
这产生了
An unexpected memory leak has occurred. The unexpected small block leaks are: 1 - 12 bytes: UnkNown x 1 13 - 20 bytes: UnkNown x 2 21 - 28 bytes: UnkNown x 2 29 - 36 bytes: UnkNown x 1
它支持8字节开销理论.
总结以上是内存溢出为你收集整理的Delphi动态数组包含哪些簿记数据?全部内容,希望文章能够帮你解决Delphi动态数组包含哪些簿记数据?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)