【C++】不是用new生成的对象调用析构函数

编程入门 行业动态 更新时间:2024-10-15 06:22:00

【C++】不是用new生成的对象调用析构<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数"/>

【C++】不是用new生成的对象调用析构函数

2023年10月23日,周一上午


#include <iostream>class Book{
private:int price;
public:~Book(){std::cout<<"调用析构函数"<<std::endl;	}
};int main(){Book b1;b1.~Book();
}

从运行结果可以看出:

手动调用b1.~Book()时,对象并没有被销毁,只是执行了析构函数里面的输出“调用析构函数”。假如手动调用b1.~Book()时对象被销毁了,那么不可能再次执行析构函数里面的输出“调用析构函数”,毕竟对象都没了还怎么执行。

手动调用析构函数不等于销毁对象:析构函数只是一个函数,并不能销毁对象。

但是销毁对象时会自动调用析构函数:系统销毁对象时会自动调用析构函数。


为了更好的理解这个问题,我做出如下的进一步的解释:

首先,要正确理解析构函数的作用。

析构函数是给系统来调用的,而不是给程序员来调用的。当系统销毁一个对象时会自动调用这个由程序员写好的析构函数来完成一些额外的工作,比如释放堆内存。

其次,调用析构函数并不会销毁对象。

析构函数其实就是一个普通的函数而已,唯一的特别之处就是系统销毁对象时会自动调用它,而它本身并不具有销毁对象的功能。


参考资料:

是否可以手动调用析构函数_主动调用析构函数_isyb的博客-CSDN博客答案是可以。但是有个误区要注意。虽然可以手动调用析构函数,但是对象的内存并没有释放。看一下代码示例:#include "stdafx.h"#include #include #ifdef _DEBUG#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)#endifusing namespace std;class A{public:A() { cout <_主动调用析构函数++中为什么手动调用析构函数之后对象还能使用,按理说虽然内存还没释放但对象已经没了啊? - 知乎#include <iostream>using namespace std;class A{public:A():m_a(5){cout<<"A()&#…

更多推荐

【C++】不是用new生成的对象调用析构函数

本文发布于:2023-12-04 17:14:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1661638.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   对象

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!