内存管理类实例
我怀疑.Net中的内存管理。 根据我的理解,记忆被分配并恢复如下:
对于所有值类型,框架将在堆栈中分配内存。
对于所有的参考类型,内存将被分配到堆中,然后由GC进行刷新或管理。
我怀疑是在下面的情况:
Class MathLibrary{
int number1;
int number2;
public int computesum(){
return number1 + number2;
}
}
MathLibrary maths = new MathLibrary(); // Class instance
内存分配如何发生在这里,我理解这个对象(数学)的引用将被存储在堆栈中,并且实际的内存将被分配到堆中。 如果那么,分配给值类型(两个整数变量)和方法定义的内存在哪里。
对于所有值类型,框架将在堆栈中分配内存。
这并非总是如此。 如果值类型是在方法中声明的,它将会在堆栈中。 如果它是一个类级别的变量,它将在堆上,因为拥有它的对象被分配在堆上。
因此,对于MathLibrary,这两个整数也会堆在一起,因为它们是该对象的字段。
对于所有的参考类型,内存将被分配到堆中,然后由GC进行刷新或管理。
是的,这是真的。 然而,这里需要记住的一件重要事情是该对象将被分配到堆上,但如果该对象是在方法内创建的,则该对象的引用将位于堆栈上。 实际的对象将在堆上。 例如:
public void Foo()
{
Foo f = new Foo();
}
引用“f”将在栈上,但引用所引用的实际对象将位于堆上。
那么你对价值类型的理解是错误的! 通常有两条黄金法则:
此外,还有Stack
和Heap
这两个事实:
Stack
负责跟踪我们代码中执行的内容(方法调用,传递参数,...)。 Heap
负责跟踪对象。 因此,在你的例子中,两个值类型(number1和number2)都是在一个引用类型的类中声明的,所以作为你的类的一个实例的对象将被分配在Heap
因为这两个值类型都会被分配! 由于maths
对象实际上是对实际对象的引用,它完全取决于它的声明位置! 举例来说,如果它是在方法声明, Stack
将负责保持一个什么样的被称为磁道,所以maths
引用将驻留在堆栈并指向实际对象Heap
。 但是如果它被声明为实例成员,它将驻留在Heap
。
上一篇: Memory Management for Class Instance
下一篇: Function variables stored on heap or stack in address space?