广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++析构函数内部工作机制详解
  • 306
分享到

C++析构函数内部工作机制详解

C++析构函数原理C++析构函数工作机制 2023-02-27 11:02:41 306人浏览 安东尼
摘要

目录1、析构函数的内部工作机制2、默认析构函数的内部工作机制3、析构函数的调用我们主要从三个方面来学习析构函数的工作原理: 析构函数的内部工作机制默认析构函数的内部工作机制析构函数的

我们主要从三个方面来学习析构函数的工作原理:

  • 析构函数的内部工作机制
  • 默认析构函数的内部工作机制
  • 析构函数的调用

1、析构函数的内部工作机制

众所周知,在对象的生命周期结束时会自动调用析构函数用于清理对象所申请的资源,那么它是如何清理的呢?

析构函数会调用delete函数释放对象中new出来的空间,即析构函数通过delete函数来清理对象所申请的资源,当然如果对象没有申请资源,那么就无需调用delete函数

由于是new出来的对象是在堆上分配空间的,即使离开了作用域,其依然存在,我们必须在析构函数中主动delete来释放new出来的在堆上的空间,否则对象消亡后,离开了作用域后,指向该空间的数据成员(指针)就会消失,我们失去了对这片空间的控制权,别人也无法使用这片空间,这就会造成内存泄漏。

如果对象是new出来的,那么它就是一个堆对象,不会被 操作系统自动回收,需要我们手动调用delete函数释放该堆对象,在delete函数中会先调用析构函数释放该对象所申请的资源,那么析构函数如何释放对象所申请的资源呢,就是前面所说的,析构函数又会调用delete函数来释放对象所申请的资源,当然如果对象没有申请资源,那么就无需调用delete函数。

#include <iOStream>
using namespace std;
class Person {
public:
    Person() {
        cout <<  "调用了Person的构造函数" << endl;
    }
    ~Person() {
        cout << "调用了Person的析构函数" << endl;
    }
private:
    int name;
};
int main() {
    Person* person = new  Person();
    delete person;
    return 0;
}

2、默认析构函数的内部工作机制

我们清楚了析构函数的内部工作机制后,继续思考一个问题,默认析构函数它的内部是怎么工作的呢?

我们先来看看下面这段代码

class Time
{
public:
	~Time()
	{
		cout << "~Time()" << endl;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本类型(内置类型)
	int _year = 1970;
	int _month = 1;
	int _day = 1;
	// 自定义类型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

程序运行结束后输出:~Time(),在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数?

这就涉及到默认析构函数的内部工作机制了。

默认析构函数,对于基本类型成员不做处理,对于自定义类型成员会去调用它的析构函数。

总结: 默认构造函数对基本类型不做处理,对自定义类型会调用它的默认构造函数,默认拷贝构造函数对基本类型是按照字节方式直接拷贝的,对自定义类型是调用其拷贝构造函数完成拷贝的,默认析构函数对基本类型不做处理,对自定义类型会调用它的析构函数。默认赋值运算符对基本类型成员变量以值的方式逐字节拷贝。而对自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

默认构造函数只有一个,析构函数只有一个,拷贝构造函数只有一个,赋值运算符重载只有一个

如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,什么事都不会干,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏

3、析构函数的调用

析构函数在对象消亡时被调用,以清理对象所申请的资源,那具体它在何时被调用呢?

析构函数主要在以下4种情况下会被调用:

对象生命周期结束,此时会自动调用析构函数。

#include<iostream>
using namespace std;
class Person {
public:
    Person() {
        cout << "调用了Person的构造函数" << endl;
    }
    ~Person() {
        cout << "调用了Person的析构函数" << endl;
    }
private:
    int name;
};
int main() {
    Person person;
    return 0;
}

运行结果如下图所示:

该运行结果说明,在对象的生命周期结束后,会自动调用对象的析构函数。

成员关系:对象car是对象person的成员,person的析构函数被调用时,对象car的析构函数也被调用。

#include <iostream>
using namespace std;
class Car {
public:
    Car() {
        cout << "调用了Car的构造函数" << endl;
    }
    ~Car() {
        cout << "调用了Car的析构函数" << endl;
    }
private:
    int name;
};
class Person {
public:
    Person() {
        cout << "调用了Person的构造函数" << endl;
    }
    ~Person() {
        cout << "调用了Person的析构函数" << endl;
    }
private:
    int name;
    Car car;
};
int main() {
    Person person;
    return 0;
}

先调用的是包含类的析构函数,然后调用的是成员对象的析构函数

继承关系:当Person是Student的父类,调用Student的析构函数,会调用Person的析构函数。

#include <iostream>
using namespace std;
class Person {
public:
    Person() {
        cout << "调用了Person的构造函数" << endl;
    }
    ~Person() {
        cout << "调用了Person的析构函数" << endl;
    }
private:
    int name;
};
class Student :public Person {
public:
    Student() {
        cout << "调用了Student的构造函数" << endl;
    }
    ~Student() {
        cout << "调用了Student的析构函数" << endl;
    }
private:
    int name;
    string no;
};
int main() {
    Student student;
    return 0;
}

先调用的是派生类的析构函数释放派生类的资源,然后调用的才是父类的析构函数释放父类成员所指向的资源

值得注意的是,如果派生类对象是new出来的对象,基类指针指向一个new生成的派生对象,通过delete销毁基类指针指向的派生类对象时,有以下两种情况:

1、 如果基类析构函数不是虚析构函数,则只会调用基类的析构函数,派生类的析构函数不被调用,此时派生类中申请的资源不被回收。

2、 如果基类析构函数为虚析构函数,则释放基类指针指向的对象时会调用基类及派生类析构函数,派生类对象中的所有资源被回收。

到此这篇关于c++析构函数内部工作机制详解的文章就介绍到这了,更多相关C++析构函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++析构函数内部工作机制详解

本文链接: https://www.lsjlt.com/news/197666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++析构函数内部工作机制详解
    目录1、析构函数的内部工作机制2、默认析构函数的内部工作机制3、析构函数的调用我们主要从三个方面来学习析构函数的工作原理: 析构函数的内部工作机制默认析构函数的内部工作机制析构函数的...
    99+
    2023-02-27
    C++析构函数原理 C++析构函数工作机制
  • C++析构函数内部工作机制是什么
    本篇内容主要讲解“C++析构函数内部工作机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++析构函数内部工作机制是什么”吧!1、析构函数的内部工作机制众所周知,在对象的生命周期结束时会...
    99+
    2023-07-05
  • C++:构造函数,析构函数详解
    目录前言一、面向对象二、构造函数1.基本概念2.构造函数重载1.构造函数分类2.有参构造函数:3.有参构造函数3个调用规则:4.拷贝构造函数5.析构函数总结前言 上期了解C++类中有...
    99+
    2022-11-12
  • C++中默认无参构造函数的工作机制浅析
    在不实现构造函数的情况下,编译器会自动生成一个默认无参构造函数。但是看起来编译器自动生成的无参默认构造函数似乎没有什么用,比如创建p对象时调用了编译器生成的无参默认构造函数,但是p对...
    99+
    2023-02-28
    C++默认无参构造函数 C++无参构造函数 C++构造函数
  • C++超详细讲解析构函数
    目录特性析构函数处理自定义类型编译器生成的默认析构函数特性 析构函数是特殊的成员函数 特征如下: 析构函数名是~类名;无参数无返回值;一个类有且只有一个析构函数;对象声明周期结束,编...
    99+
    2022-11-13
  • C++中构造函数与析构函数的详解及其作用介绍
    目录构造函数默认构造函数有参构造函数析构函数析构函数例子析构函数执行时机局部对象全局对象构造函数 构造函数 (constructor) 是一种特殊的成员函数. 它会在每次创建类的新对...
    99+
    2022-11-12
  • C++中的复制构造函数详解
    目录复制构造函数复制构造函数的三种调用复制构造函数的禁用深拷贝与浅拷贝一定会生成默认复制构造函数吗?参考 总结普通变量的复制 有时我们会在定义一个变量的同时使用另一个变量来初始化它。...
    99+
    2022-11-12
  • C++中函数匹配机制详解
    首先,编译器会确定候选函数然后确定可行函数可行函数,再从可行函数中进一步挑选 候选函数:重载函数集中的函数 可行函数:可以调用的函数 最后进行寻找最佳匹配 有以下几种规则 1.该函数...
    99+
    2022-11-13
  • C++中默认无参构造函数的工作机制是什么
    这篇文章主要介绍“C++中默认无参构造函数的工作机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中默认无参构造函数的工作机制是什么”文章能帮助大家解决问题。在不实现构造函数的情况下,编...
    99+
    2023-07-05
  • python反射机制内置函数及场景构造详解
    目录反射的优点场景构造反射中的内置函数getattrhasattrsetattrdelattr__import__模块反射反射的优点 它的核心本质其实就是基于字符串的事件驱动,通过字...
    99+
    2022-11-13
    python反射机制内置函数 python反射机制
  • C++类与对象及构造函数析构函数基础详解
    目录C++类与对象类的定义对象的创建构造函数和析构函数访问修饰符继承多态成员变量与成员方法总结C++类与对象 C++是一门面向对象的编程语言。在C++中,我们可以利用类来创建对象,...
    99+
    2023-05-16
    C++类对象函数 c++ 构造析构函数
  • Mysql锁内部实现机制之C源码解析
    目录概述行锁结构表锁结构事务中锁的描述概述 虽然现在关系型数据库越来越相似,但其背后的实现机制可能大相径庭。实际使用方面,因为SQL语法规范的存在使得我们熟悉多种关系型数据库并非难事,但是有多少种数据库可能就有多少种锁的...
    99+
    2022-08-22
  • C语言内存操作函数详解
    目录头文件:#include<memory.h>1.memcpy2.memmove3.memcmp4.memset总结头文件:#include<memory.h&g...
    99+
    2022-11-12
  • C++超详细分析讲解内联函数
    目录宏函数(带参数的宏)的缺点inline修饰的函数就是内联函数内联函数的特点宏函数和内联函数的区别宏函数(带参数的宏)的缺点 第一个问题:宏函数看起来像一个函数调用,但是会有隐藏一...
    99+
    2022-11-13
  • C++构造析构赋值运算函数应用详解
    目录了解C++默默编写哪些函数不想使用编译器函数为多态基类声明virtual析构函数别让异常逃离析构函数绝不在构造和析构过程中调用virtual函数令operator=返回一个ref...
    99+
    2022-11-13
  • C++编程析构函数拷贝构造函数使用示例详解
    目录构造函数析构函数拷贝构造之深拷贝和浅拷贝深浅拷贝区别首先定义一个类进行操作。 class MM { public: protected: int year; ...
    99+
    2022-11-12
  • C++类与对象深入之构造函数与析构函数详解
    目录对象的初始化和清理一:构造函数1.1:构造函数的特性1.2:构造函数的分类二:析构函数2.1:概念2.2:特性三:拷贝构造函数3.1:概念3.2:特性3.3:拷贝构造函数调用时机...
    99+
    2022-11-13
  • C++超详细讲解构造函数与析构函数的用法及实现
    目录写在前面构造函数和析构函数语法作用代码实现两大分类方式三种调用方式括号法显示法隐式转换法正确调用拷贝构造函数正常调用值传递的方式给函数参数传值值传递方式返回局部对象构造函数的调用...
    99+
    2022-11-13
  • C++类的特种函数生成机制详解
    目录C++类的特种函数生成机制规则例子:A BUG例子:std::mutex和std::thread题外话:为什么std::mutex不可移动?总结C++类的特种函数生成机制 规则 ...
    99+
    2022-11-12
  • 了解len函数的内部机制与实际应用
    探索len函数的工作原理与实际应用在编程中,len函数是一种常用的函数,用于获取一个序列或集合的长度。无论是字符串、列表、元组或字典等都可以通过len函数来获得它们的元素个数。本文将深入探索len函数的工作原理,并通过具体的代码示例来说明它...
    99+
    2023-12-28
    工作原理 实际应用 len函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作