gpt4 book ai didi

delphi - 清除创建的对象内存

转载 作者:行者123 更新时间:2023-12-03 19:15:48 27 4
gpt4 key购买 nike

我正在使用 WMI SMBios获取一些硬件信息

查看uSMBios.pas

我不希望用户看到内存中使用的序列号是什么,所以我试图清除它

当我打电话时

SMBios:=TSMBios.Create;
//my code
SMBios.free;

SMBios 对象仍在内存中的许多位置 WinHex

我在 Destroy Event 上尝试了此代码
    if Assigned(FRawSMBIOSData.SMBIOSTableData) then
begin
ZeroMemory(FRawSMBIOSData.SMBIOSTableData,FRawSMBIOSData.Length);
FreeMem(FRawSMBIOSData.SMBIOSTableData);
end;

它与 GetSystemFirmwareTable 一起工作得很好SMBios 中的 API 代码,但在 WMI 中它删除了一些内存,但我仍然可以找到几个 block

想知道为什么在调用 object.free 或 freeandnil 后使用的内存没有释放

知道如何强制应用程序释放它吗?

最佳答案

内存被释放,只是没有被删除。你可能搞错了两个概念:内存绑定(bind)到某个所有者,不能给另一个所有者,并且内存中的所有信息都被清除了。

看,当你走过新鲜的雪地或沙滩时,你会留下你的脚步。你搬走了,所以你去过的地方现在免费供其他人占用。但是你的足迹一直在那里,直到有人用他自己的足迹覆盖它们。

现在,你可能是偏执狂,每走一步你都会回头,拿起刷子,移开你新的脚步。这是可能的并且可能是有道理的,但它可能会非常缓慢。

一些对象可能会处理敏感数据,如密码、密码 key 、大规模计算中的个人数据等。对于这些对象,有一种偏执的感觉,会抹去它们的每一个痕迹。因此,这些对象的写入方式是在上次使用后立即删除它们不再需要的内存。并在析构函数中再次执行此操作。

但是,当您刚刚关闭表单并显示“文件已成功保存”之类的消息时,没有任何 secret 值得画。这是该程序的大部分内容。

所以现在请确定你是否真的有一些敏感数据,比如密码。如果你这样做 - 你的代码应该在释放之前用不同的数据覆盖它。而且您必须了解如何在 Delphi 中为不同类型保存数据,因此在处理它们的过程中不会将数据片段复制到内存的其他位置。但很可能您不需要实际销毁的数据,您只需要标记“这个地方对任何人都可以免费将他们的数据放在我的垃圾上”,这就是 Delphi 上释放对象的实际作用。如果这对您来说已经足够了,那么您就不必费心删除数据(这是用随机垃圾代替敏感垃圾,但仍然是垃圾)。

现在,关于 LU RD 和 whosrdaddy 的建议几句话。是的,Delphi 为您提供了连接堆管理方式的方法,并在将公寓标记为空闲之前用垃圾显式删除数据。然而,这只是敏感数据的部分解决方案。

  • 99.9% 的时间你会清除不值得的数据。字符串、动态数组、TList 和其他容器会很慢——你的程序也会很慢。
  • 您的应用程序由具有局部变量的过程组成。其中许多变量,如短字符串、固定大小的数组、GUID,是在堆栈上而不是在堆上分配的。这些建议不会清理它们,只会免费。
  • 您的对象通常在 Delphi 堆中分配内存。但他们也可能以其他方式分配它。在 Windows 堆中,在一些多线程感知池中,或其他任何东西中。修改默认的 Delphi 堆管理器行为不会删除该内存。

  • 总的来说是一样的想法。您的程序或您的对象知道哪些数据是危险的以及保存在哪里——该对象或程序负责清理。全局德尔福规模的解决方案既无效又不可靠。

    关于delphi - 清除创建的对象内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21201630/

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