社区
C#
帖子详情
对象设置为null,为什么引用变量还存在
corruption
2007-09-22 02:27:40
....
//--创建类实例
MyClass obj1=new MyClass();
//--引用
MyClass obj2=obj1;
//--释放
obj1=null;
//--查看obj2
if(obj2!=null) //--?????按理说这个obj2也应该为null
error("不为空");
....
class MyClass
{
}
...全文
336
12
打赏
收藏
对象设置为null,为什么引用变量还存在
.... //--创建类实例 MyClass obj1=new MyClass(); //--引用 MyClass obj2=obj1; //--释放 obj1=null; //--查看obj2 if(obj2!=null) //--?????按理说这个obj2也应该为null error("不为空"); .... class MyClass { }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
duduly
2007-09-23
打赏
举报
回复
最好不要把null赋给任一个变量,毫无意义的事情
比如你有连接到数据库的连接,或是对文件进行操作的句柄,赋给null没有用的
要显示调用XXX.close(); 或是 XXX.dispose();
等下一轮垃圾回收线程对分配的空间或资源进行释放
GC工分成0,1,2代区
0代最小,小到能装到寄存器缓冲区里,等0代回收完之后,没有释放的资源便自动放到1代中了,依次类推
GC.Collect(); //将对0,1,2代区都进行垃圾回收
GC.Collect(0);//将对0代区都进行垃圾回收
GC.Collect(1);//将对0,1代区都进行垃圾回收
GC.Collect(2);//将对0,1,2代区都进行垃圾回收,跟GC.Collect();效果一样
wuqing5220
2007-09-22
打赏
举报
回复
i=n=5
n=0
i=0?
xminsong
2007-09-22
打赏
举报
回复
两个指向同一地址的变量(obj1、obj2),你只释放了obj1,obj1不再指某对象,
为null,但原对象还在,你并没有释放obj2,obj2还是指向该对象,当然不为null啦!
cyy1981
2007-09-22
打赏
举报
回复
设置为null 了 并没有释放掉空间,只有当gc调用给dispose 才release
jlhx_NET
2007-09-22
打赏
举报
回复
obj1.dispose()是显式回收外部资源,比如关闭文件等(当然,这就要你自己来写了),内存资源的释放,还得依靠垃圾回收器,垃圾回收器定期回收内存资源,Avoid(千金散尽还复来) 说得对,只要引用还在,那么是不会执行垃圾回收的,即使垃圾回收定期触发,也不会回收有引用的内存资源。其实,form类提供的Dispose函数就是一个典型的例子:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
如果你要显式回收资源,就可以调用窗体对象.Dispose(),这个函数声明,实际上是调用上面的重载形式:
private void Dispose()
{
Dispose(true);//释放所有与窗体对象关联的控件对象占用的外部资源
}
如果垃圾回收器回收资源,会自动调用析构函数,当然,在IDE里你是看不到的,被封装了,应该是下面的形式:
~Form()
{
Dispose(false);//仅释放窗体对象的外部资源,至于控件所占用的外部资源,说不定在窗体 对象释放前,就已经被释放了,因为垃圾回收器自动回收是没有顺序的
因此你只管对象本身就行了
}
Visual00000000
2007-09-22
打赏
举报
回复
obj1.dispose()
应该也不会让GC立即回收obj1吧,GC会自己选择时间执行垃圾回收
调用GC.Collect()应会立刻回收
对垃圾回收不是很了解,建议看下<<.NET框架程序设计>>相关的章节
Avoid
2007-09-22
打赏
举报
回复
只要引用还在,那么是不会执行垃圾回收的
Ny-6000
2007-09-22
打赏
举报
回复
obj1.dispose()
这个方法应该可以的吧.?
fancystyle
2007-09-22
打赏
举报
回复
那怎么让obj1销毁?
fancystyle
2007-09-22
打赏
举报
回复
汗,真的不为空...难道还要等GC来收集?
netcoder
2007-09-22
打赏
举报
回复
obj1=null;
作用把obj1这个引用变量设置为空引用
至于obj1之前引用什么对象,对那个对象是没有任何影响的
比如:
A和B都喜欢C
现在A不喜欢C了
那B还是喜欢C
JGood
2007-09-22
打赏
举报
回复
if(obj2!=null) //--?????按理说这个obj2也应该为null
=========>
当然不为null
obj1与obj2同时指向引用MyClass的一个实例,
obj1 = null; 这不是释放,obj1不再引用MyClass的实例,但obj2仍在引用。
尹成Python27天入门到项目实战
算学费输入数据求最大精确划分思维解决最大次大交换数据实现按行显示围棋棋盘绘制国际象棋绘制为什么要用函数函数的四种类型函数的一般形式必须用函数的理由-哥德巴赫函数的本质就是地址函数
变量
意义函数
变量
用途...
Java
对象
使用后
设置
为
null
不会减少内存占用
答:不会,
设置
为
null
只是栈中指向的
引用
为
null
,但是 new 出来的
对象
还是
存在
于堆里面的,按照目前的 GC 算法,要等 survior1 or survior2 满的时候 JVM 才会调用 GC 命令清除对应 survior 区的
对象
,将没有栈...
java中的
null
占用内存地址吗,Java
对象
使用后
设置
为
null
会减少内存占用吗?
答:不会,
设置
为
null
只是栈中指向的
引用
为
null
,但是 new 出来的
对象
还是
存在
于堆里面的,按照目前的 GC 算法,要等 survior1 or survior2 满的时候 JVM 才会调用 GC 命令清除对应 survior 区的
对象
,将没有栈...
Java
对象
和
引用
变量
对于
引用
变量
的深层含义,未必在初学的时候就能深刻理解, 所以理解好下面这两句话的真正含义非常重要Case cc=new Case();... 基本类型的
变量
和
对象
的
引用
变量
存取速度比堆要快,仅次于寄存器,栈
C#中未将
对象
引用
设置
到
对象
的实例
C#中未将
对象
引用
设置
到
对象
的实例是什么意思? 意思是你使用这
对象
之前没有将之实例化 可能出现的原因 一 1.ViewState
对象
为
Null
2.Dateset空 3.sql语句或Datebase的原因导致DataReader空 4.声明字符串
变量
是未赋...
C#
110,537
社区成员
642,576
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章