问个小白问题,当析构函数被显示调用以后,会发生什么?

来源:百度知道 编辑:UC知道 时间:2024/05/26 14:00:42
当析构函数被显示调用以后,会发生什么?
类的实例(对象)是否还存在?
类中用new分配的内存是否delete——假设显式调用的析构函数中没有delete?
自己调用析构函数,与程序自动调用析构函数有什么区别?
显式调用析构函数只是清除对象本身, 并没有释放对象所占的内存。
——这是什么意思啊?难道对象所占的内存,和用new申请的内存不同吗?

你好

我试着来回答你的问题,有异议我们再讨论

(1)构造函数首先是不能被显示调用的,它是在程序运行中,当你创建对象时由系统自动调用的,很显然他和一般的成员函数是不一样的,首先函数名和类一样,其次它没有返回值,为什么没有返回值这正是因为它由系统调用,是没有程序能够接收它的返回值的,而上面和其他的成员函数不同的两点,正是编译器能够识别它是构造函数,而其他不是的原因

(2)析构函数和构造函数一样同样不能被程序显示的调用,它是在对象生存期结束的时候由系统自动调用的,而调用这个函数是为了释放分配给对象的内存空间,至于编译器为什么能识别原因同构造函数

(3)总结一下:即构造函数和析构函数是不能被显示调用的,既然都不能显示的调用,所以也就无法谈论你说的区别了 ,如果硬要说区别,那就是如果你用new构建了一个对象,那你就要在析构函数中自己加上delete,注意delete是释放动态分配的内存空间,而没加delete的析构函数,它回收的只是在栈上分配的对象内存,也即是静态分配的对象内存

好了,祝你好运

显式调用析构函数只是清除对象本身, 并没有释放对象所占的内存。
而用new申请的内存,使用delete释放,默认的析构函数不会释放该内存。
如果在构造函数中有用new申请的内存, 那么在析构函数中就要用delete释放,
否则会发生内存泄漏。
程序自动调用析构函数,除了清除了对象本身,还释放了对象所占的内存。

显示调用构造函数和析构函数就想调用一般的函数一样,并不意味着创建或销毁对象。但是注意,如果构造函数中动态分配了空间,则显示调用构造函数会出现内存泄露;如果析构函数中释放动态分配的空间,则会出现多次释放统一内存,会出现严重错误。

参考:http://blog.csdn.net/piratejk/article/details/4693316