C# 类实例的内存管理
我怀疑.Net中的内存管理。根据我的理解,内存分配和恢复如下:C# 类实例的内存管理,c#,.net,memory-management,clr,C#,.net,Memory Management,Clr,我怀疑.Net中的内存管理。根据我的理解,内存分配和恢复如下: 对于所有值类型,框架将在堆栈中分配内存 对于所有引用类型,将在堆中分配内存, 稍后将由GC清除或管理 对于堆栈中分配的内存,将在中清除内存 执行完成时的后进先出方法 我对以下情况表示怀疑: Class MathLibrary{ int number1; int number2; public int computesum(){ return number1 + number2; } } 内存分配是如何发生的,我知道这个
Class MathLibrary{
int number1;
int number2;
public int computesum(){
return number1 + number2;
}
}
内存分配是如何发生的,我知道这个对象的引用(数学)将存储在堆栈中,实际内存将分配在堆中。如果是,那么为值类型(两个整数变量)和方法定义分配的内存将在哪里
对于所有值类型,框架将在堆栈中分配内存
这并不总是正确的。如果在方法中声明了值类型,它将进入堆栈。如果它是类级变量,则它将位于堆上,因为拥有它的对象是在堆上分配的
因此,对于MathLibrary,2个整数也将位于堆上,因为它们是该对象的字段
对于所有引用类型,内存将在堆中分配,稍后将由GC清除或管理
是的,这是真的。但是,这里需要记住的一件重要事情是,对象将在堆上分配,但是如果此对象是在方法中创建的,则对象的引用将在堆栈上。实际对象将位于堆上。例如:
public void Foo()
{
Foo f = new Foo();
}
引用“f”将在堆栈上,但引用所引用的实际对象将在堆上
对于所有值类型,框架将在堆栈中分配内存
这并不总是正确的。如果在方法中声明了值类型,它将进入堆栈。如果它是类级变量,则它将位于堆上,因为拥有它的对象是在堆上分配的
因此,对于MathLibrary,2个整数也将位于堆上,因为它们是该对象的字段
对于所有引用类型,内存将在堆中分配,稍后将由GC清除或管理
是的,这是真的。但是,这里需要记住的一件重要事情是,对象将在堆上分配,但是如果此对象是在方法中创建的,则对象的引用将在堆栈上。实际对象将位于堆上。例如:
public void Foo()
{
Foo f = new Foo();
}
引用“f”将在堆栈上,但引用所引用的实际对象将在堆上 你对值类型的理解是错误的!通常有以下两条黄金法则:
堆栈
和堆
,还有以下两个事实:
堆栈
负责跟踪代码中执行的内容(方法调用、传递参数等)Heap
负责跟踪对象堆上分配,这两种值类型也是如此!由于数学
对象实际上是对实际对象的引用,因此它完全取决于声明它的位置!
例如,如果它是在一个方法中声明的,Stack
将负责跟踪调用的内容,因此mathematics
引用将驻留在堆栈上,并指向堆上的实际对象。但是,如果它被声明为实例成员,它将驻留在堆上那么您对值类型的理解是错误的!通常有以下两条黄金法则:
将在堆上分配引用类型
值类型和指针(对其他对象的引用)将分配到声明它们的位置,而不总是在堆栈上李>
此外,关于堆栈
和堆
,还有以下两个事实:
堆栈
负责跟踪代码中执行的内容(方法调用、传递参数等)
Heap
负责跟踪对象
因此,在您的示例中,这两种值类型(number1和number2)都是在引用类型的类中声明的,因此作为类实例的对象将在堆上分配,这两种值类型也是如此!由于数学
对象实际上是对实际对象的引用,因此它完全取决于声明它的位置!
例如,如果它是在一个方法中声明的,Stack
将负责跟踪调用的内容,因此mathematics
引用将驻留在堆栈上,并指向堆上的实际对象。但是,如果它被声明为实例成员,它将驻留在堆上
,然后有具有自己语义的捕获变量。然后有具有自己语义的捕获变量。我下面的答案是否回答了您的问题?如果是,请阅读下面我的回答是否回答了您的问题?如果是,请阅读