C++ 析构函数

C++ 析构函数


C++ 中的 析构函数(Destructor) 是类的一种特殊成员函数,用于在对象生命周期结束时执行清理操作,如释放资源、关闭文件、释放内存等。析构函数在对象被销毁(如超出作用域、delete 被调用)时自动调用。

一、析构函数的基本语法

class ClassName {
    public:
        ~ClassName();  // 析构函数声明
};

特点:

  • 析构函数名和类名相同,但前面加上 ~ 符号。
  • 没有参数,也不能被重载(即一个类只能有一个析构函数)。
  • 没有返回值类型,甚至不能写 void
  • 可以是 publicprotected、或 private(如禁止用户删除对象时用 private)。
  • 可以是 virtual,用于确保多态删除时调用正确的析构函数。

二、析构函数的调用时机

  1. 栈对象超出作用域时自动调用:

    {
        MyClass obj;
        // obj 构造时自动调用构造函数
    } // 到作用域末尾,自动调用析构函数
    
  2. 堆对象通过 delete 删除时自动调用:

    MyClass* ptr = new MyClass();
    delete ptr;  // 调用析构函数后释放内存
    

三、析构函数示例

#include <iostream>

using namespace std;

class MyClass{

private:
    int *datas;

public:
    MyClass(int size){
        datas = new int[size];
    };

    ~MyClass(){
        cout << "析构函数被调用!" << endl;
        delete[] datas;
    }
};

int main()
{
    MyClass m1(5);
    MyClass *m2 = new MyClass(10);

    delete m2;

    return 0;
}

在这里插入图片描述

在这个示例中, MyClass 的构造函数分配了一块内存,而析构函数释放了这块内存。当 obj 的生命周期结束时(即离开了它的作用域), MyClass 的析构函数被自动调用,负责清理资源,防止内存泄露。


四、析构函数的重要性

析构函数在管理资源方面非常重要。没有正确实现析构函数,可能导致资源泄露或其他问题。在基于RAII(资源获取即初始化)原则的C++编程实践中,确保资源在对象析构时被适当释放是非常关键的。当使用智能指针和其他自动资源管理技术时,可以减少显式编写析构函数的需要,但了解析构函数的工作原理仍然很重要。

以下是关于 C++ 中析构函数需要了解的十个要点的表格:

标注粗体部分,是能快速上手的内容,方便后续QT的学习,而没有粗体的部分,会在QT结束后,如果安排C++深入讲解的课程的话,会安排到。

要点描述
定义和作用析构函数在对象生命周期结束时自动调用,用于清理对象可能持有的资源。
语法析构函数名称由波浪线 (~) 后跟类名构成,例如 MyClass 的析构函数为~MyClass()
资源管理用于释放对象在生命周期中分配的资源,如动态内存、文件句柄、网络连接等。
自动调用机制当对象离开其作用域或通过 delete 删除时,将自动调用其析构函数。
防止资源泄露正确实现析构函数对防止资源泄露至关重要,特别是在涉及动态资源分配的情况。
虚析构函数如果类作为基类设计,应有一个虚析构函数,以确保正确调用派生类的析构函数。
析构函数与异常析构函数不应抛出异常,如果可能抛出,应在函数内捕获。
删除的析构函数可以通过将析构函数声明为删除( ~MyClass() = delete; )来禁止删除某类对象。
与构造函数的关系每个类只能有一个析构函数,不可重载,与构造函数相比。
规则三则/五则如果类需要自定义析构函数、拷贝构造函数或拷贝赋值运算符,可能也需要自定义另外两个(规则三则)。在 C++11 后还包括移动构造函数和移动赋值运算符(规则五则)。

这个表格概括了在学习和使用 C++ 析构函数时应考虑的主要点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值