是否可以手动调用析构函数
答案是可以。
但是有个误区要注意。虽然可以手动调用析构函数,但是对象的内存并没有释放。看一下代码示例:
#include "stdafx.h"
#include <iostream>
#include <crtdbg.h>#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
using namespace std;class A
{
public:A() { cout << "构造" << endl; };~A() { cout << "析构" << endl; };virtual void func() {};char c;
};int main()
{//检测内存泄漏,在vs输出窗口调试状态下,可以显示内存泄漏的代码位置_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);A* p = new A;p->~A();
// delete p;return 0;
}
调试上面的代码会发现,存在内存泄漏,因为A类型的对象没有释放内存。
这里的误区就是不明确析构函数的作用。虽然在使用delete时会调用析构函数,但是内存的释放不是由析构函数完成的。
析构函数和构造函数的作用是,在使用new时,new会先分配内存,然后调用构造函数。调用delete时,会先调用析构函数,再释放内存。因此,析构函数只是会在调用delete时被执行,但释放内存并不是析构函数完成的,而是delete完成的,因此,销毁对象时要用delete,而不是直接调用析构函数。手动调用析构函数是可以的,但是没太大意义。
是否可以手动调用析构函数相关推荐
- python在删除对象时会自动调用析构函数_Python面向对象程序设计构造函数和析构函数用法分析...
本文实例讲述了Python面向对象程序设计构造函数和析构函数用法.分享给大家供大家参考,具体如下: 构造函数和析构函数 1.构造方法的使用 很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名 ...
- C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用
一.vptr的位置 class test { public:int i; virtual void testfunc() {} };int main() {test a;char* p1 = rein ...
- delete不调用析构函数的两种情况
1. 所使用的类为预定义类 下面这段函数代码编译运行时没有问题的,不需要CPtr的定义 ---PtrUser.h class CPtr; // 预定义 class CPtrUser { public: ...
- 中有atoi函数吗_C++ 多态的实现及原理,深挖vptr指针,手动调用虚函数
什么是多态? 父类指针即根据指向的不同对象,响应同一消息(函数调用),产生不同行为. 多态三要素? 1,继承 2,虚函数重写 3,父类指针(引用)指向子类对象 多态的实现很简答,让我们来看一段代码 # ...
- 飞鸽传书:谈谈RenderControl手动调用
飞鸽传书:谈谈RenderControl手动调用,手动调用控件的RenderControl方法,OnPreRender方法不执行的解决办法. 有些网页需要在后台动态创建服务器控件,并且将控件的html ...
- 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件
GitHub源码仓库:Qt学习例程 1. QPainter绘图抗锯齿 /// 抗锯齿测试 /// painter.drawEllipse(QPoint(100,50), 50, 50);// 设置 抗 ...
- C++ 什么时候调用析构函数和构造函数
析构函数是在对象消亡时,自动被调用,用来释放对象占用的空间. 有四种方式会调用析构函数: 1.生命周期:对象生命周期结束,会调用析构函数. 2.delete:调用delete,会删除指针类对象. 3. ...
- 关于c++显示调用析构函数的陷阱
一.文章来由 现在在写一个项目,需要用到多叉树存储结构,但是在某个时候,我需要销毁这棵树,这意味着如果我新建了一个树对象,我很可能在某处希望将这个对象的声明周期终结,自然会想到显示调用析构函数,但是就 ...
- C++ 容器存储对象时,指针调用析构函数触发的一系列BUG
今天给大家分享一篇BUG文章,请耐心看完,也许你以后也会遇到这样的BUG而解决不了! 需求是这样的: 定义一个Student类,里面有私有成员整型和指针! 例如:int age; char *name ...
最新文章
- vim 键盘宏操作 -- 大道至简
- 【重学Vue】数据响应原理真的是双向绑定吗?
- 面向初级 Web 开发人员的 Tomcat
- bootstrap-wysiwyg: 迷你的Bootstrap的所见即所得的HTML富文本编辑器
- django 的用户验证及登录状态保持
- 原来Rproj还可以这么使用
- 提升服务器性能的建议
- 【转载】并发操作会带来哪些数据不一致性(数据库)
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
- Ripple(Glance)
- 解决Eclipse Pydev中import时报错:Unresolved import
- java 从m个数中均匀找出n个数_M个数里面找出最大的N个数
- jquery validation用法
- python编程和继承_python面向对象编程-继承与派生
- CentOS 7服务
- 数据分析:AI智能科技影响下,电话机器人实现落地
- 如何修复win7蓝牙服务器,快速解决win7系统蓝牙驱动的修复方法
- js 生成二维码及打印
- UART使用EDMA收发
- el-table使用span-method合并行
热门文章
- 03.HTML CSS
- 企业如何做好营销管理?
- 8104网站端服务器返回错误,Catalyst 9800无线控制器普通的无线客户端连通性问题...
- openlayers6 使用svg格式图片作为Icon标记
- POI兴趣点在地图显示上进行聚合算法的研究
- 人的一生,要死去三次。
- python实验报告心得1000字,python数据分析论文2000字
- python初学者_初学者的热门Python资源
- 《C# 语言入门详解(刘铁锰) - 学习笔记 - Lambda表达 / Linq查询》
- “Map.get“ and value test should be replaced with single method call