• c++析构函数


    析构函数

    1、概念

    析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

    是清理工作而不是销毁,因为栈帧会随着程序的结束而销毁,是系统进行销毁,而析构函数是对动态开辟的空间里的资源进行清理

    2、怎么使用

    在写栈时我们会在函数的最后对开辟的空间进行销毁,有时我们会忘记调用对开辟的空间进行销毁这个函数,所以我们可以使用析构函数,在main函数中不用调用,编译器自己进行调用析构函数进行资源的清理。

    class Stack
    {
    public:
    	Stack(size_t capacity = 3)
    	{
    		cout << "Stack(size_t capacity = 3)" << endl;
    
    		_a = (int*)malloc(sizeof(int) * capacity);
    		if (nullptr == _a)
    		{
    			perror("malloc申请空间失败!!!");
    		}
    
    		_capacity = capacity;
    		_top = 0;
    	}
    //析构函数
    ~Stack(){
    free(_a);
    _capacity=_top=0;
    _a=nullprt;
    }
    
    private:
    	int* _a;
    	int _capacity;
    	int _top;
    };
    
    int main()
    {
    	Stack st1;
    
    	MyQueue mq;
    
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3、特征

    1. 析构函数名是在类名前加上字符 ~。
    2. 无参数无返回值类型。
    3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
    4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
    5. 关于编译器自动生成的析构函数,编译器自动生成的析构函数不会对我们写的栈动态开辟空间进行清理。对内置类型不做处理,对自定义类型成员会去调用他的析构函数。

    4、番外

    1、构造顺序是按照语句的顺序进行构造,析构是按照构造的相反顺序进行析构。
    2、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在,因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象。
    3、全局对象先于局部对象进行构造.
    4、局部对象按照出现的顺序进行构造,无论是否为static。
    5、析构的顺序按照构造的相反顺序析构,只需注意static改变对象的生存作用域之后,会放在局部对象之后进行析构。

    C c;
    
    int main()
    
    {
    
    	A a;
    
    	B b;
    
    	static D d;
    
      return 0}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    上述程序中A,B,C,D析构函数调用顺序为B、A、D、C。

  • 相关阅读:
    【彩色图像处理GUI】各种颜色映射、重新调整大小和更改分辨率、伽玛校正,对比度,反转颜色(Matlab代码实现)
    【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
    .NET MAUI 多平台应用 UI 应用
    53. 最大子数组和
    修复 Java 错误 $‘ ‘: Command Not Found
    如何从消失的异常堆栈定位线上问题
    JWT相关知识
    Kubernetes之Pod生命周期管理
    本科阶段学习方向的建议
    Dubbo之注册与发现
  • 原文地址:https://blog.csdn.net/m0_54427678/article/details/134022890