gpt4 book ai didi

c# - 循环范围和内存问题

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:33 25 4
gpt4 key购买 nike

假设我有以下代码...

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
MyCustomClass myObj = new MyCustomClass();
sb.Append(myObj.RenderShortString());
}
Console.Write(sb.ToString());

并假设 MyCustomClass 是一个非常大的对象。例如,假设它创建并保存一个包含 1MB 字符串的内部成员。 RenderShortString() 方法简单地呈现一个长度约为 100 个字符的字符串。

注意这个循环 10000 次。

我有一些基本上像这样的东西导致循环内的 System.OutOfMemory 异常。

我的问题与垃圾收集器何时清理为 myObj 的每个实例分配的内存空间有关。我认为 StringBuilder 没有问题,但我可能错了。我感觉 myObj 的实例正在内存中分配,但在退出循环之前不可用于清理。它是否正确?如果是这样,我如何告诉应用程序,一旦我获得呈现的字符串,我就完成了该实例?

最佳答案

您看到了 .net 中的垃圾回收“功能”。一旦超出范围,对象将被销毁,并且每个 myObj 在每次迭代中都超出范围,但您不知道什么时候,因为 GC 是不确定的。

这里有一些解释:Loops and Garbage Collection

此外,这里还有一项关于 .net GC 的有趣研究。它建议尽可能避免在循环内使用“new”。

http://nerds-central.blogspot.com/2008/10/net-garbage-collector-pain.html

关于c# - 循环范围和内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316703/

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