C++:析构函数的调用时机
结论:只有当类的某个实例化对象的构造函数执行完毕,而且当该对象退出作用域时,才会执行析构函数。
如果在执行构造函数的过程中抛出了异常,就不会调用析构函数
上测试代码:
class Test
{
public:
Test()
{
cout << "Test() begin..." << endl;
throw();
cout << "Test() end" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
}; int main()
{
try
{
Test t1;
}
catch (...)
{
cout << "........................................." << endl;
}
return ;
}
执行结果:

推出这么一种不安全的情况
class Example
{
public:
Example()
{
m_p1 = new int[];
m_p2 = new int[]; //如果这句代码抛出异常,则m_p2已经分配的资源会自动释放
//但是由于Example的构造函数尚未完全执行,因此当离开作用域时
//Example的析构函数不会被执行,导致m_p1分配的资源永远不会被释放
//ps:若是对象的构造函数尚未执行完全但是当对象退出作用域时仍然执行析构函数会发生什么?
//ps:在此种情况下,m_p2明明已经没有任何资源被它管理了,它最后却依然被delete[],仍然造成不合理的结果
}
~Example()
{
delete[] m_p1;
delete[] m_p2;
}
private:
int* m_p1;
int* m_p2;
};
进一步推出结论:在一个类中不要管理多个资源,如果必须要管理多个资源,则创建多个资源管理类,将这些资源一对一滴分配给资源管理类来进行管理,再将资源管理类作为成员放在目标类中。
C++:析构函数的调用时机的更多相关文章
- EC笔记,第二部分:9.不在构造、析构函数中调用虚函数
		
9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...
 - C++继承,多重继承,虚继承的构造函数以及析构函数的调用顺序问题
		
#include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout < ...
 - C++C++中构造函数与析构函数的调用顺序
		
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...
 - [Reprint]c++ 析构函数的调用
		
析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢.写段代码总结下 #include <iostream> using namespace std; class Bo ...
 - MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
		
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
 - C++箴言:避免构造或析构函数中调用虚函数
		
如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉.但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼. 正 ...
 - C++ 构造函数和析构函数的调用顺序、虚析构函数的作用
		
构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...
 - c++有关构造函数和析构函数中调用虚函数问题
		
今天看了一道迅雷的笔试题目,然后引起一段思考,题目如下: 下列关于虚函数的说法正确的是()A.在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效.B.在析构函数中调用类自己的虚函数,虚函数的 ...
 - (copy)赋值构造函数的4种调用时机or方法
		
第一种调用方法: demo #include <iostream> using namespace std; class Text { public: Text() // 无参数构造函数 ...
 
随机推荐
- 命令别名设定:alias,unalias  历史命令:history
			
1.别名设定举例 alias lm=‘ls -al | more’ 还可以取代现有指令 alias rm='rm -i' 查询现有别名 alias 取消别名 unalias lm 2.历史命令:his ...
 - 密码 | 对称加密 - AES
			
一.AES 算法简介 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替换 ...
 - GXOI&GZOI
			
T1 与或和 2s&&512MB 简明题意:求一个矩阵的所有子序列的 \(and\)和 和\(or\)和: 子矩阵的\(and\)和就是所有值\(and\)起来:\(or\)类 ...
 - React Hooks 一步到位
			
useState 用来声明状态变量. import React, { useState } from 'react'; // ... const [ count , setCount ] = useS ...
 - kindeditor富文本编译器
			
一.网址 kindeditor.net/about.php 二.编辑器的使用,看官方文档 三.常用初始化参数 1.resizeType2或1或0,2时可以拖动改变宽度和高度,1时只能改变高度,0时不能 ...
 - [洛谷P4097] [HEOI2013] Segment
			
Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 2.给定一个数 \(k\) ,询问与直线 \(x = k\ ...
 - python GUI测试自动化
			
#! /usr/bin/env python#coding=GB18030'''GUI测试自动化 语言:python模块:pywinauto环境:windows7中文.python-2.6_32bit ...
 - NHibernate  初识(0)
			
参考资料: http://nhibernate.info/
 - 深入Node.js的进程与子进程:从文档到实践
			
欢迎关注Github仓库,这是一个自2018年起持续更新的前端&算法开源博客.目前已有node学习.js面试笔记.css3动画设计.webpack4系列教程.设计模式.剑指offer·js版等 ...
 - 关于DockerFile组件,java8新特性的AWT组件,
			
前段时间由于公司业务开发了App产品,产品用CocosCreator打出来的App, 用的时候,发现获取验证码,获取不到值,折腾了几天,一开始欢迎安装的jdk有问题,但是几次验证不是jdk的问题, 最 ...