41.结构体析构函数

41.结构体-析构函数


41.1 知识点

析构函数的基本概念

析构函数是在对象被释放时自动调用的方法。这意味着析构函数主要处理堆内存回收相关的工作,因为堆内存空间需要我们自己手动回收。

它的主要作用是当结构体对象被释放时,能够将其中在堆上分配的内容清理掉,避免内存泄漏。

析构函数的声明

  • 声明在结构体中。
  • 没有返回值,没有参数。
  • 函数名必须与结构体名相同,并且在前面加 ~ 符号。
  • 只能有一个析构函数,不能重载。
  • 如果类中没有定义析构函数,编译器会自动生成一个默认的析构函数,该函数会依次调用所有成员的析构函数。
struct Student
{
    int age;
    string name;
    Student* p;

    Student(int age, string name) : age(age), name(name), p(nullptr) {}

    // 析构函数
    ~Student()
    {
        if (p != nullptr)
            delete p;
        p = nullptr;
        cout << "释放完毕" << endl;
    }
};

析构函数的使用

析构函数不需要我们手动调用,它是自动调用的函数。当对象的生命周期结束时,析构函数会自动被调用。

对象释放时机是:

  • 栈中的内容:当对象超出作用域时就会释放。
  • 堆中的内容:delete 删除对象时就会释放。
Student s = { 10, "韬老狮" };

s.p = new Student(35, "韬老狮的妈妈");
cout << s.p->name << endl; // 韬老狮的妈妈
delete s.p; // 释放完毕
s.p = nullptr;

总结

析构函数不需要我们自己手动调用,它会在对象生命周期结束时自动调用。我们只需要把重点放在析构函数中,去释放结构体中在堆上分配的内容即可。


41.2 知识点代码

Lesson41_结构体_析构函数.cpp

#include <iostream>
using namespace std;

#pragma region 知识点一 析构函数的基本概念

//析构函数 是当对象被释放时会调用的方法
//也就意味着在析构函数中主要处理的就是堆内存回收相关的工作
//因为堆内存空间需要我们自己手动回收

//它的主要作用就是用来当结构体对象被释放时
//能够将其中在堆上分配的内容清理掉,避免内存泄漏

#pragma endregion

#pragma region 知识点二 析构函数的声明

//基本规则
//声明在结构体中
//1.没有返回值,没有参数
//2.函数名必须和结构体名相同,并且在前面加~符号
//3.只能有一个析构函数,不能重载
//4.如果类中没有定义析构函数,编译器会自动生成一个默认的析构函数,该函数会依次调用所有成员的析构函数

struct Student
{
    int age;
    string name;
    Student* p;

    Student(int age, string name) : age(age), name(name), p(nullptr) {}

    //析构函数
    ~Student()
    {
        if (p != nullptr)
            delete p;
        p = nullptr;
        cout << "释放完毕" << endl;
    }
};

#pragma endregion

#pragma region 知识点三 析构函数的使用

//析构函数不需要我们手动调用
//它是自动调用的函数
//当对象的生命周期结束时,析构函数会自动被调用
//对象释放时机:
//1.栈中的内容,当对象超出作用域时就会释放
//2.堆中的内容,delete 删除对象时就会释放

#pragma endregion


int main()
{
    std::cout << "析构函数\n";

    #pragma region 知识点三 析构函数的使用

    Student s = { 10, "韬老狮" };

    s.p = new Student(35, "韬老狮的妈妈");
    cout << s.p->name << endl;//韬老狮的妈妈
    delete s.p;//释放完毕
    s.p = nullptr;

    //while (true)
    //{

    //}

    //语句块结束前打印释放完毕 因为s被释放

    #pragma endregion
}

#pragma region 总结

//析构函数 不需要我们自己手动调用
//他会在对象生命周期结束时自动调用
//我们只需要把重点放在 在析构函数中 去释放结构体中在堆上分配的内容即可

#pragma endregion

41.3 练习题

析构函数如何声明?

~结构体名()

析构函数的作用是什么?

析构函数是用于在对象生命周期结束时执行清理工作的特殊成员函数。
主要用来处理对象被销毁时的一些特殊逻辑,比如:释放动态分配的内存、打印调试信息等等。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏