C++ Primer复制控制 13.3 析构函数

转载 2016年06月01日 20:55:28

   如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则。这个规则常称为三法则,指的是如果需要析构函数,则需要所有这三个复制控制成员。

         复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static 成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。

 当用户没有显式定义析构函数时, 编译器同样会为对象生成一个默认的析构函数, 但默认生成的析构函数只能释放类的普通数据成员所占用的空间, 无法释放通过 new 或malloc 进行申请的空间, 因此有时我们需要自己显式的定义析构函数对这些申请的空间进行释放, 避免造成内存泄露。

 

可以看出,析构函数在 main 函数运行结束前被执行,并且调用顺序和构造函数正好相反,为了方便记忆,我们可以将之理解为一个栈,先入后出。

析构函数在对象被销毁前执行;要知道析构函数什么时候被调用,就要先知道对象什么时候被销毁。

对象可以认为是通过类这种数据类型定义的变量,它的很多特性和普通变量是一样的,例如作用域、生命周期等。由此可以推断,对象这种变量的销毁时机和普通变量是一样的。

总结起来,有下面几种情况:
1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。

2) static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。

3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。

4) 如果用 new 运算符动态地建立了一个对象,当用delete 运算符释放该对象时,先调用该对象的析构函数。

注意:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以分配给新对象使用。


举报

相关文章推荐

C++primer13章习题

//13.3假定Point为类类型,该类类型有一个复制构造函数,指出下面程序段中每一个试用了复制构造函数的地方。   Point global;   //默认构造函数 Point foo_bar...

C++ Primer复制控制 13.3 析构函数

如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则。这个规则常称为三法则,指的是如果需要析构函数,则需要所有这三个复制控制成员。          复制构造函数或赋值操作...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

C++ Primer复制控制 13.1复制构造函数

※复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。          ※有一种特别常见的情况需要类定义自己的复制控制成员的:类具有指针成员。 13....

C++复制控制 析构函数

复制构造函数(拷贝构造函数)

重温C++ primer 之复制控制(复制构造函数,赋值操作符,析构函数)

#pragma once #include #include class Exmpl { public: Exmpl(void){} Exmpl(const Exmpl &) { std::c...

c++primer 3/12----复制构造函数

C++ 支持两种初始化形式):直接初始化和复制初始化。复制初始化使用 = 符号,而直接初始化将初始化式放在圆括号中。 当形参或返回值为类类型时,由复制构造函数进行复制 string make_...

C++ Primer 学习笔记 — 复制控制

复制控制详细介绍——复制构造函数、赋值构造函数和析构函数

C++ Primer学习之(13)——复制控制

P601: 复制构造函数:一种特殊构造函数,具有单个形参,该形参(c)

C++派生类的构造函数和复制控制函数

复制成员和构造函数式 一、派生类的构造函数

C++ Primer 笔记--13章:复制控制

包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针的地址,而不会复制指针指向的对象。 将一个指针复制到另一个指针时,两个指针指向同一个对象,此时可能使用任一指针改变这一对象。类似的,很可能一...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)