gpt4 book ai didi

memory-leaks - 如何正确销毁对象,以免它们导致内存泄漏

转载 作者:行者123 更新时间:2023-12-04 05:08:54 24 4
gpt4 key购买 nike

当我创建两个相互引用的字典对象时,即使我将它们显式设置为空,它们也会留在内存中。以下代码消耗 >1 GB 的内存

Dim i
For i = 1 to 100000
leak
Next

Sub leak

Dim a, b
Set a = createObject("scripting.dictionary")
Set b = createObject("scripting.dictionary")

a.Add "dict1", b
b.Add "dict2", a

Set a = Nothing
Set b = Nothing

end sub

这与某些垃圾收集无关(VBScript 不这样做)。证明:当我改变时 a.Add "dict1", ba.Add "dict1", "foo"b.Add "dict2", aa.Add "dict2", "bar"内存消耗保持在合理的范围内。

顺便说一句,这也发生在字典引用自身时:
Sub leak
Dim a
Set a = createObject("scripting.dictionary")
a.Add "dict1", a
Set a = Nothing
end sub

是否有可能以它们也在内存中销毁的方式销毁像这些交叉引用字典这样的对象?

最佳答案

找到字典的答案:使用 RemoveAll在引用超出范围之前删除所有键和值的方法。测试了一下,没有泄漏:

Sub leak

Dim a, b
Set a = createObject("scripting.dictionary")
Set b = createObject("scripting.dictionary")

a.Add "dict1", b
b.Add "dict2", a

a.RemoveAll
b.RemoveAll

end sub

如果您将字典用作 keys,这也解决了循环引用问题。 (而不是 items/ values )如:
a.Add b, "dictionary b"
b.Add a, "dictionary a"

关于memory-leaks - 如何正确销毁对象,以免它们导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15136400/

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