【发布时间】:2010-12-04 01:27:06
【问题描述】:
假设我有一些像这样的简单struct:
public struct WeightedInt {
public int value;
public double weight;
}
那么假设我有一个这种结构的实例集合:
List<WeightedInt> weightedInts = new List<WeightedInt>();
据我了解,值类型与引用类型相比,值类型是在堆栈上分配的,因此一旦实例化所述对象的函数终止,值类型对象就会从内存中清除。这意味着在以下代码中:
void AddWeightedIntToList(int value, double weight) {
WeightedInt wint = new WeightedInt();
wint.value = value;
wint.weight = weight;
weightedInts.Add(wint);
}
局部变量wint的副本被添加到weightedInts,而局部变量自身在AddWeightedIntToList完成后从内存中删除。 p>
首先:这是正确的吗?
其次,wint 的这个副本存储在哪里?它不能在堆栈上,因为一旦函数完成它就会消失(对吗?)。这是否意味着副本与weightedInts 一起存储在堆上?是不是被移除后被垃圾回收了,就好像它是引用类型的一个实例一样?
这个问题肯定有可能在某篇文章中得到解答,在这种情况下,指向该文章的链接将是一个完全可以接受的答案。我只是没有运气找到它。
【问题讨论】:
-
值类型不在堆栈上分配。不在迭代器块中或被匿名函数关闭的值类型的局部变量可以在堆栈上分配,并且经常在堆栈上分配,但它们需要不是。它们可以在堆上分配,也可以在寄存器中分配。
-
如果您对“值类型分配在堆栈上”的错误分析感兴趣,这里有两篇我写过的关于该主题的文章:blogs.msdn.com/ericlippert/archive/2009/04/27/… 和 blogs.msdn.com/ericlippert/archive/2009/05/04/…跨度>
标签: c# .net garbage-collection heap-memory stack-memory