从汇编看c++的默认析构函数的使用详解_C 语言

c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数。由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者的分析情况一样(对于默认的构造函数分析,请参看《从汇编看c++中默认构造函数的使用分析》)。并且编译器会提供非无用的默认析构函数情形和默认构造函数类似:

1 类含有虚成员函数(类继承自虚基类或者继承的基类含有虚成员函数,也属于这种情况)

2 类继承自一个基类,基类含有自定义析构函数(如果基类没有自定义析构函数,但是编译器会为它提供一个非无用的默认析构函数,也属于这种情况。这就是说,只要基类含有一个析构函数,不管这个析构函数是自定义的,还是编译器提供的非无用的默认析构函数,都行)

3 类包含一个成员对象,该成员对象自定义析构函数(如果成员对象没有自定义析构函数,但是编译器会为它提供一个非无用的默认析构函数,也属于这种情况。这就是说,只要成员变量含有一个析构函数,不管这个析构函数是自定义的,还是编译器提供的非无用的默认析构函数,都行).

并且,对于编译器提供的默认析构函数,不管是无用的,还是非无用的,它们都不会自动清除对象里面所包含的资源。

时间: 2024-12-10 00:44:06

从汇编看c++的默认析构函数的使用详解_C 语言的相关文章

解析c++中的默认operator=操作的详解_C 语言

在c++中,如果没有定义operator=操作,编译器会提供一个默认的operator=操作.由于operator=操作和拷贝构造函数的功能类似,都执行拷贝操作.因此,编译器也分提供无用的默认operator=操作和非无用的默认operator=操作.并且什么时候提供非无用的默认operator=操作和无用的等操作的情形也和拷贝构造函数类似.(详细分析过程请参考<基于c++中的默认拷贝函数的使用详解>) 对于一个类,编译器会提供非无用的operator=操作的情形: 1 该类是含有虚成员函数(

C++函数参数取默认值的深入详解_C 语言

一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数应与形参相同.有时多次调用同一函数时用同样的实参,C++提供简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了.如有一函数声明float area(float r=6.5);指定r的默认值为6.5,如果在调用此函数时,确认r的值为6.5,则可以不必给出实参的值,如area( );  //相当于area(6.5);如果不想使形参取此默认值,则通过实参另行给出.如area(7.5); //形参得到的值为7.5,而不是6.5这

从汇编看c++中的多态详解_C 语言

在c++中,当一个类含有虚函数的时候,类就具有了多态性.构造函数的一项重要功能就是初始化vptr指针,这是保证多态性的关键步骤. 构造函数初始化vptr指针 下面是c++源码: class X { private: int i; public: X(int ii) { i = ii; } virtual void set(int ii) {//虚函数 i = ii; } }; int main() { X x(1); } 下面是对应的main函数汇编码: _main PROC ; 16 : in

从汇编看c++中引用与指针的使用分析_C 语言

首先是引用情形下的c++源码: 复制代码 代码如下: void add(int a, int b, int&c) {    c = a + b;} int main() {    int a = 1;    int b = 2;    int c = 0;    add(a, b, c); } 下面是main对应的汇编码: 复制代码 代码如下: ; 6    : int main() {     push    ebp    mov    ebp, esp    sub    esp, 12  

基于c++中的默认拷贝函数的使用详解_C 语言

<c++编程思想>上说一个类如果没有拷贝函数,那么编译器就会自动创建一个默认的拷贝函数.下面就让我们看一下真实的情况. 首先看一个简单的类X,这个类没有显示定义拷贝构造函数. c++源码如下: 复制代码 代码如下: class X {private:    int i;    int j;}; int main() {    X x1;//先定义对象x1    X x2 = x1;//将x1拷贝给x2} 下面是其汇编代码: 复制代码 代码如下: _main    PROC ; 7    : i

C#中构造函数和析构函数用法实例详解_C#教程

本文实例讲述了C#中构造函数和析构函数用法.分享给大家供大家参考,具体如下: 构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误.本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项. 一.构造函数与析构函数的原理 作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性.C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙.但是程序通过了编译检查并不表示错误

从汇编看c++中默认构造函数的使用分析_C 语言

c++中的源程序: 复制代码 代码如下: class X {private:    int i;}; int main() {    X x;} 上面的类X没有定义构造函数,仅仅有一个int i. 下面为其汇编程序: 复制代码 代码如下: ; 7    : int main() {     push    ebp;ebp为一个寄存器,总是指向一个函数调用堆栈的栈底,作为基址,用偏移量来访问该调用栈上的变量,但这里没有任何变量要访问,因此不起作用     mov    ebp, esp;这两句的作

C++类成员构造函数和析构函数顺序示例详细讲解_C 语言

对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象.C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数. (2)类的非静态数据成员,按照声明的顺序创建. (3)执行该类的构造函数. 即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数. 下面看一个例子吧 复制代码 代码如下: class c{public:    c(){ printf("c\n"); }protected:private:}; class b {pub

解析C++中构造函数的默认参数和构造函数的重载_C 语言

C++构造函数的默认参数 和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. [例] #include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数 int volume( ); private : int height; int width; int l