`
RednaxelaFX
  • 浏览: 3052791 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

this的寿命?

阅读更多
NyaRuRuさん的blog真是一个宝库,有许多有启发性的日记。刚才读到这么一篇:this の寿命,虽然是06年的老文,却还是让我惊讶了一番。

文中提到,“this”在实际运行中并不一定在其作用域内都存活;在作用域结束前,它有可能就已经被回收(delete this)了。文中举了这样一个例子(稍微修改过):
testGC.cs:
// compile this file with the following command:
// csc /o /d:TRACE testGC.cs

using System;
using System.Threading;
using System.Diagnostics;

class Test {
    IntPtr _myHandle = IntPtr.Zero;

    ~Test( ) {
        Trace.WriteLine( "Finalize; Release Handle" );
    }

    public void Foo( ) {
        Trace.WriteLine( "Get Handle from OS : 123456" );
        _myHandle = ( IntPtr ) 123456;
        Bar( _myHandle );
    }

    public void Bar( IntPtr handle ) {
        GC.Collect( );
        Thread.Sleep( 1000 );
        Trace.WriteLine( "Use Handle : " + handle.ToString( ) );
    }
}

static class Program {
    static void Main( string[ ] args ) {
        Trace.Listeners.Add( new ConsoleTraceListener( ) );
        new Test( ).Foo( );
    }
}

运行的结果是:
引用
Get Handle from OS : 123456
Finalize; Release Handle
Use Handle : 123456

从trace结果可以看到,Test的析构器在Test.Foo()还在运行中就执行了。这与一般认识似乎相差甚远:Main()里对Test.Foo()的调用尚未完成,也就是说应该还有对这个对象的引用,所以这个Test对象应该暂时还无法被析构才对。
事实上,受到JIT的内联优化等影响,程序运行的时候还有没有对某个对象的引用,与源码中不一定总是对应的;极端情况下,在一个对象的构造器执行过程中,这个对象就可能已经被析构了。在这帖有一串有趣的讨论。

Chris Brumme也写过一篇关于GC.KeepAlive()的帖子:Lifetime, GC.KeepAlive, handle recycling
分享到:
评论
3 楼 hd700 2008-10-07  
我也认为是jit的问题,我曾经写了一篇关于局部变量被回收的问题。http://blog.csdn.net/fuadam/archive/2008/09/03/2876002.aspx
2 楼 RednaxelaFX 2008-10-04  
COM的话多半跟这个没什么关系……这个是JIT带来的问题,COM不使用JIT,GC也不是M&S而是RC的。
1 楼 lwwin 2008-10-04  
COM里面似乎也会碰到……不知道是不是类似的?
memberfunc里面delete this…………

相关推荐

    sdp.82.zip_This Is How_opnet ad hoc

    例如,如何设置节点的移动轨迹,选择合适的传播模型(如两维或三维自由空间模型、阴影衰落模型等),以及如何考虑节点的能量消耗和电池寿命。 文件列表中的"Opnet deliverables"可能包含了仿真项目的结果输出,比如...

    Bluetooth_module.rar_This Is A Book_www

    相比传统的蓝牙技术,BLE在保持稳定连接的同时,显著降低了能源消耗,延长了设备的电池寿命。 文档首先会讲解蓝牙模块的硬件组成,包括射频(RF)部分、微控制器(MCU)、存储器以及电源管理单元等。这些组件协同工作,...

    Power and Thermal Managemrnt in this Intel Core Duo Processor

    标题中的“Power and Thermal Management in this Intel Core Duo Processor”指的是英特尔酷睿双核处理器的电源与热管理技术。这是计算机硬件领域的一个重要话题,尤其是在设计高效能和低功耗的系统时。Intel Core ...

    wsn.rar_This Is How_inetwork_sensor

    "wsn.rar_This Is How_inetwork_sensor" 提供的程序是为了演示无线传感器网络的工作原理。 无线传感器网络的核心组成部分包括: 1. **传感器节点(Sensor Nodes)**:每个节点通常包含微控制器、传感器、无线通信...

    f.rar_Fuel cell_This Is It_fuel cell control_fuel cell matlab

    在"this is new approach for fuel cell control"这一描述中,我们可以理解为该压缩包文件提供了一种创新的燃料电池控制系统设计。 燃料电池控制是燃料电池系统中的关键部分,它确保燃料电池能够在各种运行条件下...

    SSD1【Unit3】答案【Exercise8,Practical Quiz 8】

    6. SSD的耐用性和寿命:由于闪存有限的擦写次数(P/E周期),SSD的寿命比HDD短。但现代SSD通过损耗均衡技术和其他手段延长了使用寿命。 7. 驱动器健康状态监控:SSD通常配备SMART(Self-Monitoring, Analysis, and ...

    final_fuzzy_S.rar_Fuel cell_This Is It_fuel cell matlab

    "This Is It" 可能是指这个项目或者研究方法的独特之处,即提出了一种新颖的燃料电池控制策略。在这个压缩包 "final_fuzzy_S.rar" 中,包含了名为 "final_fuzzy_S.mdl" 的文件,这很可能是用MATLAB编写的模糊逻辑...

    This Program finds and displays the Drive’s Space.

    标题 "This Program finds and displays the Drive’s Space" 暗示了这是一个计算机程序,它的主要功能是检测并显示计算机硬盘驱动器的可用空间信息。在IT领域,这属于系统管理和资源监控的一部分,对于用户理解存储...

    脉冲阈值法测注入式激光器的载流子寿命

    This paper describes the measurement of carrier lifetime of GaAs/GaAlAs DH lasers. Simplified experimental system without high speed detecter and very broad band amplifier is used.

    Web的全寿命周期建设项目集成管理系统研究.docx

    成果, this paper demonstrates the necessity, significance, and theoretical foundation of the topic.2.It delves into the concept of a full lifecycle construction project and the essence of project ...

    七年级(下册)Unit_3_Our_animal_friends教(学)案_含课后作业.docx

    - 考虑到不同动物的寿命,引导学生讨论并找出答案,如乌龟或某些鱼类。 5. **Which animal do you think has four legs when it was newly born, two legs when it is young and three legs when it’s getting old...

    详解linux电源管理驱动编写

    对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处。所以,各个soc厂家在这方面花了很多的功夫。下面,我们可以看看linux是如何处理...

    新托福独立写作结构解析描述解释型.pdf

    Discuss the causes of this phenomenon.) 2. 解释为什么有些学生选择去国外留学(如:Many students choose to attend schools or universities outside their home countries. Why do some students study ...

    固态硬盘修复软件,亲测可用。

    总的来说,固态硬盘修复软件对于维护SSD的正常运行和延长其寿命具有重要作用。通过定期检查和适时的维护,用户可以有效地预防和解决可能出现的硬盘问题,保护重要数据的安全。在使用这类软件时,应遵循正确的操作...

    爱普生R270清零

    标题“爱普生R270清零”指的是针对爱普生R270喷墨打印机的一项维护操作,主要是为了重置打印机内部的计数器,以解决由于墨盒计数...此外,定期的打印机维护,如适当的墨盒管理和打印头清洁,也是延长打印机寿命的关键。

    爱普生R270清零软件

    打印机的计数器是用于跟踪打印页数和墨盒使用寿命的机制,当这些计数器达到一定程度,即使墨盒仍有墨水,打印机也会认为它们已耗尽并显示错误。 清零软件的工作原理是通过与打印机的固件交互,找到并修改存储计数器...

    VF企业工资管理系统(系统+课程设计)

    例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高工资管理的效率,也是科学化、正规化管理的重要条件。 设计目的 对于企、事业单位的工资发放来说,不需要太大型的...

    icarnegie SSD5 Recommended Exercise1

    7. **SSD的寿命与耐用性**:讲解写入次数限制(P/E周期)和总字节写入(TBW),以及如何监控和管理SSD的寿命。 8. **固件更新**:如何通过制造商的驱动程序和固件更新来增强SSD的稳定性和性能。 9. **数据安全**:...

    基于改进粒子群算法的同步器多目标参数优化.pdf

    This paper focuses on the multi-objective parameter optimization of a synchronizer in a transmission system using an improved particle swarm optimization (PSO) algorithm. The primary goal is to ...

Global site tag (gtag.js) - Google Analytics