C#实例化内存分配问题

2025-01-07 06:37:09
推荐回答(3个)
回答1:

首先,堆和栈是两码事。堆(heap)主要用于动态内存分配,而栈(stack)主要是用于函数内自动变量的空间分配。

在C#中,任何引用类型的变量,都是在堆上分配的。(强制声明stackalloc等特殊情况除外)
各种class就是引用类型,所以都是在堆上分配的。

你那个例子,有两个变量,一个是C1,一个是C2,它们各自有一个成员a,彼此互不影响。
二者都分配在堆上,位置不同。所以你C1中a的值是12,C2中a的值是6,二者之间没有影响。

回答2:

楼主是新手吧(话说我也是新手来着,从来都没入过门),堆栈的概念都不一样的,怎么会分配堆栈中。
我说说看,不对的话,咱们再讨论:
首先A第一次实例化(也就是C1),那么系统会为它分配一段内存,用来储存数据;(其实你可以在这用指针标记下地址,int* C11=&C1.a)
然后A第二次实例化(也就是C2),那么系统又会为它分配一段内存,用来储存数据;;(其实你依然可以在这用指针标记下地址,int* C22=&C2.a)
然后你调用了,C1.a,也就是说你调用了内存地址为C11的数据,即c1.a的数据存放在C11地址的内存中,你调用了数据,然后输出到屏幕;
然后你为C2.a赋值,即你将内存地址C22的数据从12更改为6;
最后,你调用C2.a输出。
a变量,在两次实例化时,就给各自为其分配了一段内存空间(注解:如果不实例化,那么系统是不会为你分配内存的)。
若有错漏,万望指正。

回答3:

打印出来结果是:
C1.a
C2.a

╮(╯▽╰)╭怎么会是12 和 6 呢?求教!O(∩_∩)O哈哈~

言归正传吧,不逗你了!
当你每次使用new A()实例化一个对象时,都是调用A类的构造函数在堆中开辟了一个新地址(注意:每次使用都会开辟)。而这个地址中就有一个int变量,这个int变量的值初始化是12,当你对这个int变量的值做修改时,是不会开辟新的地址的!