【发布时间】:2017-01-17 18:04:17
【问题描述】:
首先,我目前正在使用 C#,并且一直在阅读有关内存管理的内容。到目前为止,我已经阅读了一些关于堆栈溢出的精彩答案,解释了堆栈内存和托管堆内存之间的区别。大多数答案表明,通过声明:int x = 5,您为堆栈内存中的x 类型分配了足够的内存。
我了解它的工作原理以及它的范围,但是当我阅读堆内存的解释时,它让我感到困惑。
如果你说int x = 5,因为int 是System.Int32 的别名,那么x 在技术上不是指向System.Int32 结构的新实例的指针吗?如果是这样,它不会存储在堆内存中,因为它用于实例对象。
在this 教程中,它指出(对于class1 cls1 = new class1() 行):
... 在堆栈上创建一个指针,实际对象存储在称为“堆”的不同类型的内存位置中。
按照这个逻辑,不是所有的东西都存储在堆上,而只有指针存储在堆栈上吗?例如
System.String、System.Int64、System.Boolean、System.Decimal 等的新实例。我以为我明白了,但很明显我不明白,所以我很感激有人解释堆栈是否仅用于指针或我误解了哪一部分。提前致谢。
【问题讨论】:
-
System.Int32是一个结构,而不是一个类。因此,作为本地,它很可能会在堆栈上分配。 -
请记住,.NET CLR 正在发生变化,“堆分配”和“堆栈分配”之间的界限越来越模糊。
-
教程错误且不完整。
-
@Nathangrad 结构在 C# 中不能为空。结构是值类型。没有引用为空。 C# 编译器可能会因“使用未初始化的变量”而出错,但这只是编译器试图提供帮助。
标签: c# pointers memory heap-memory stack-memory