关于C#当中栈(stack)和堆(heap)的问题

classA{inta=12}classB{staticvoidMain(string[]args){AC1=newA();AC2=newA();Console.Writ... class A
{
int a = 12
}
class B
{
static void Main(string[] args)
{
A C1 = new A();
A C2 = new A();
Console.WriteLine("C1.a");
C2.a=6
Console.WriteLine("C2.a");
}

}
如这个例子,c1和c2 是否是在堆中开辟一个小的内存空间,然后引用了同为堆上的a=12,对吗? 然后c2.a=6就是重新在堆上面声明了一个a=6的内存空间,是否可以这样理解?
展开
 我来答
kcxnvbdbd
2015-08-24 · TA获得超过523个赞
知道小有建树答主
回答量:885
采纳率:50%
帮助的人:619万
展开全部
第一个问题:对的。但注意 c1,c2分配的内存是完全独立的,所以c1里面的a和c2里面的a的内存地址是不一样的。
第二个问题:不对。c2.a 这个a的内存是在new的时候已经分配好的,a=6仅仅是改变内存的内容而已,不是重新开辟内存。
更多追问追答
追问
谢谢回答,那我还想问下,大部分的(函数)方法使用,是不是等于引用类型,其实就是方法在栈中运行的时候,其中的值是从堆里面引用的,然后方法使用完成,自动删除,但是引用的值还是存在在堆中的。
追答

饿。。

  1. 方法里面的引用类型变量,其内存是引用在堆上的,但是值类型变量,是分配在内存上面的。方法里面值类型变量跟类成员的值类型成员,其内存分配地址是不同的。

  2. 关于内存回收,.net有GC来管理内存回收,所以方法结束后,对于我们来说,我们不知道内存是在什么时候被回收的。“但是引用的值还是存在在堆中的”,这个是无法确定的。至于你说的“自动删除”不理解是删除什么。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式