一、析构函数的作用
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
二、对比Java和C++
读《java编程思想》读到初始化与清理一章,文中提及java的finalize()方法,联想到了C++的析构函数。finalize()方法与析构函数存在天然差别,这种差别源于语言本身机制的不同。
1、对无用对象的回收时间不同
在C++中,对象是可以在栈上分配的,也可以在堆上分配。在栈上分配的对象,也就是函数的局部变量,当超出块的"}"时,生命期便结束了。在堆上分配的对象,使用delete的时候,对象的生命期也就结束了。因此在C++中,对象的内存在哪个时刻被回收,是可以确定的(假设程序没有缺陷)。
java秉承一切皆为对象的思想,对象仅能通过new来创建,因此java的对象是在堆上分配的内存。这些堆上的对象,如果没有作用了(无引用指向它),将等待垃圾回收器来回收其占用的内存。而垃圾回收期何时运行,无法提前预知,甚至有的时候直到程序退出都没有进行垃圾回收,程序所占内存直接由操作系统来回收。所以在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行。因此,C++与java中,对无用对象的回收时间是不同的。
一旦C++的对象要被回收了,在回收该对象之前对象的析构函数将被调用,然后释放对象占用的内存;