当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

理解finalize()-析构函数的替换者[VC/C++编程]

赞助商链接



  本文“理解finalize()-析构函数的替换者[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在很多方面,Java 近似于 C++.Java 的语法非常近似于 C++,Java 有类、办法和数据成员;Java 的类有构造函数; Java 有非常处理.

但是,假如你利用过 C++ 会发现 Java 也丢掉一些大概是你熟习的特点.这些特点之一就是析构函数.代替利用析构函数,Java 支持finalize() 办法.

在本文中,我们将描写 finalize() 与 C++ 析构函数的辨别.别的,我们将成立一个简单的 Applet 来演示 finalize() 是若何工作的.

终究的边界

与 Java 差别,C++ 支持部分对象(基于栈)和全局对象(基于堆).因为这一双重支持,C++ 也供应了自动构造和析构,这招致了对构造函数和析构函数的调用,(关于堆对象)就是内存的分配和释放.

在 Java 中,全部对象都驻留在堆内存,因此部分对象就不存在.后果,Java 的计划者认为不需求析构函数(象 C++ 中所实现的).

取而代之,Java 定义了一个特别的办法叫做finalize() ,它供应了 C++ 析构函数的一些功效.但是,finalize() 并不完好与 C++ 的析构函数一样,并可以假定它会招致一系列的问题.finalize() 办法作用的一个关键元素是 Java 的垃圾回收器.

垃圾回收器

在 C/C++、Pascal和其他几种多种用处的编程语言中,开辟者有责任在内存管理上施展主动的作用.比方,假如你为一个对象或数据构造分配了内存,那么当你不再利用它时必须释放掉该内存.

在 Java 中,当你成立一个对象时,Java 虚拟机(JVM)为该对象分配内存、调用构造函数并开始跟踪你利用的对象.当你终止利用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过垃圾回收器将该对象标志为释放状况.

当垃圾回收器将要释放一个对象的内存时,它调用该对象的finalize() 办法(假如该对象定义了此办法).垃圾回收器以独立的低优先级的方法运行,只有当其他线程挂起等候该内存释放的情形呈现时,它才开始运行释放对象的内存.(事实上,你可以调用System.gc() 办法强迫垃圾回收器来释放这些对象的内存.)

在以上的描写中,有一些重要的事情需求注意.首先,只有当垃圾回收器释放该对象的内存时,才会履行finalize().假如在 Applet 或利用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize().

其次,除非垃圾回收器认为你的 Applet 或利用程序需求额外的内存,不然它不会试图释放不再利用的对象的内存.换句话说,这是完好大概的:一个 Applet 给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了.

明显,假如你为某个对象定义了finalize() 办法,JVM 大概不会调用它,因为垃圾回收器不曾释放过那些对象的内存.调用System.gc() 也不会起作用,因为它仅仅是给 JVM 一个倡议而不是号令.

finalize() 有什么长处呢?

假如finalize() 不是析构函数,JVM 不一定会调用它,你大概会迷惑它能否在任何情形下都有好处.事实上,在 Java 1.0 中它并没有太多的长处.

按照 Java 文档,finalize() 是一个用于释放非 Java 资源的办法.但是,JVM 有很大的大概不调用对象的finalize() 办法,因此很难证明利用该办法释放资源是有效的.

Java 1.1 通过供应一个System.runFinalizersOnExit() 办法部份地办理了这个问题.(不要将这个办法与 Java 1.0 中的System.runFinalizations() 办法相混合.)不象System.gc() 办法那样,System.runFinalizersOnExit() 办法并不当即试图启动垃圾回收器.而是当利用程序或 Applet 退出时,它调用每个对象的finalize() 办法.

正如你大概猜想的那样,通过调用System.runFinalizersOnExit() 办法强迫垃圾回收器排除全部独立对象的内存,当排除代码履行时大概会惹起明显的耽误.目前成立一个示例 Applet 来演示 Java 垃圾回收器和finalize() 办法是若何彼此作用的.
  以上是“理解finalize()-析构函数的替换者[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 理解finalize()-析构函数的替换者
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .