class cs { public int add(int a,int b) { int c = a+b; return c; } public void main() { int k = add(1,2); } }
当add调用完之后,c会被释放掉么?
这个时候给k赋值的是单纯的值还是c的地址?
想的太多学的太少
先百度下:作用域.建立下对变量作用域的认知.再谈变量内存释放问题.
我上面写的只是一个简单的例子,如果把int 换成引用类型呢,这个方法在重复的调用,方法内声明的变量不是在方法结束后立即销毁,那会不会造成我程序的内存无限增加?
@百鸟朝凤: 对:变量作用域 有概念吗?
@吴瑞祥: 在方法内声明的变量,方法结束后就会销毁?是说这个?
@百鸟朝凤: 变量为什么只能在作用域内使用?因为超出作用域就没了..
@吴瑞祥: 问题就在这,变量超出作用域就没了,但是这个变量是用来做返回值的,那返回值传出的是一个副本?还是说这个变量并没有实际回收,只是变成了不可访问了。 如果是副本的话,我程序不结束,方法一直在调用,那副本占用的空间是不是越来越大。 如果不是副本,是他本身的话,那他会在什么时候被销毁?
@百鸟朝凤: 当然是副本..方法一直在调用是不存在的.一个线程肯定绝对百分百同时只有一个方法在被调用.
栈的内存在超出作用域后释放.堆的内存需要代码去释放.
int是值类型,传递的时候肯定是赋值啦,你先了解什么是值类型和什么是引用类型再说吧,c变量不是立即释放的。
那把int 换成引用类型呢?
k是单纯的值,c已经超出作用域,会被释放的
要是换成引用类型呢
c是个方法的局部变量,方法结束时一定会被释放
k是个值类型的变量,给它赋值时,传递的是值的副本。
你需要了解一下 作用域的基本概念和值类型引用类型的区别。
返回值是引用类型,那什么时候被释放
@百鸟朝凤:
引用类型的对象的内存回收,那归运行时的垃圾回收机制负责。
@西漠以西: 是这个理。。。最近看c看的。。。有点混乱了