gpt4 book ai didi

android - 内存泄漏检测和循环

转载 作者:行者123 更新时间:2023-11-29 23:54:19 25 4
gpt4 key购买 nike

我尝试使用来自 https://bitbucket.org/shadow_cs/ 的跨平台内存泄漏检测代码.

我写了一个包含循环的小型 Android 演示应用程序:

type
TMyClassA = class(TObject)
public
Other : TMyClassA;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a, b: TMyClassA;
begin
a := TMyClassA.Create;
b := TMyClassA.Create;

a.Other := b;
b.Other := a;
end;

然后我在 Android 上运行它(将需要的单元添加到项目、库路径等)。

当我按下按钮并退出应用程序时,我可以在 logcat 中看到大量关于某些内容泄漏的消息,但它似乎永远不会结束。

这是因为我的周期吗?

如果是,我需要做什么,为什么它不显示泄漏对象的名称而只显示它们的地址?

摘录自 logcat:

05-25 21:00:14.257: W/leak(8382): Leak detected CC4BC740 size 48 B05-25 21:00:14.266: W/leak(8382):   01 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????05-25 21:00:14.302: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????05-25 21:00:14.334: W/leak(8382): Leak detected CC4BCEC0 size 48 B05-25 21:00:14.366: W/leak(8382):   01 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????05-25 21:00:14.400: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????05-25 21:00:14.425: W/leak(8382): Leak detected CC4B1E40 size 256 B05-25 21:00:14.467: W/leak(8382):   40 AD 6B CA C0 0F 4C CC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | @?k???L?????????????????????????05-25 21:00:14.503: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 12 4C CC 00 00 00 00 | ????????????????????????H?L?????05-25 21:00:14.543: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 1C 4C CC C8 14 4C CC 00 00 00 00 00 00 00 00 | ????????????????H?L???L?????????05-25 21:00:14.573: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????05-25 21:00:14.605: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????05-25 21:00:14.639: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????05-25 21:00:14.674: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????05-25 21:00:14.708: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????

泄漏检测项目托管在 Bitbucket 上。我是新手,但与 GitHub 不同,我看不到任何联系作者的方式。否则我会先问他们。

最佳答案

是的,这是由于周期。为了防止这些泄漏,您必须手动取消分配它们或使用 [Weak] 属性,以便编译器/RTL 知道可能的循环,并且在分配给弱字段时引用计数不会增加,而是“记住”分配并在释放对象时取消分配字段(因此您不会访问已释放的实例,但在进入该场景时仍会获得零指针 AV)。另一种选择是使用 [Unsafe](或将您的实例分配/取消分配为 Pointer(fField) := instance),这会完全抑制 ARC 和弱引用。

LeakCheck 报告所有内存泄漏,但只有某些类型包含额外信息,因此类型可以推断(LeakCheck 支持字符串/对象),因此您忽略这些未知数是正确的。

LeakCheck 确实实现了循环检测,并以 Graphviz DOT 格式输出,以便可视化。我建议使用文件日志记录(在 LeakCheck 之后将 LeakCheck.Report.FileLog 添加到您的项目中)它会将泄漏和图表输出到单独的文件(记住目的地文件夹 /storage/emulated/0/ 需要应用程序可以访问),因此它比 logcat 输出更容易传输以进行处理。有关详细信息,请参阅 CustomLeakReportFMX 示例。

关于android - 内存泄漏检测和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50535653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com