【浅谈C++析构函数】

【浅谈C++析构函数】析构函数是一种在对象生命周期结束的时候自动调用的特殊成员函数 在面向对象编程当中 对象的生命周期是指对象从创建到销毁的整个过程 析构函数通常用于执行一些清理工作 例如释放动态分配的内存 关闭文

大家好,欢迎来到IT知识分享网。

系列文章目录

        欢迎大家订阅我的《计算机底层原理》、《深度解析C++》系列专栏、我会持续为大家输出优质文章,能够帮助到大家就是对我最大的鼓励!😊


目录

系列文章目录

前言

一、什么是析构函数?

1.析构函数的概念

2.析构函数的功能

1.释放动态分配的内存

2.关闭文件或释放资源

 二、默认析构函数

1.普通内置类型

2.成员对象类型

三、析构函数的注意事项

1.不需要显式调用析构函数

2.注意资源管理

3.避免在析构函数当中执行耗时操作

 总结


前言

        这篇文章主要为大家介绍C++当中的析构函数的用法,我们这篇文章主要需要掌握,析构函数的功能是什么?默认析构函数和析构函数的区别是什么,什么情况下必须显式定义析构函数而必须使用默认析构函数。


一、什么是析构函数?

1.析构函数的概念

        析构函数是一种在对象生命周期结束的时候自动调用的特殊成员函数,在面向对象编程当中,对象的生命周期是指对象从创建到销毁的整个过程,析构函数通常用于执行一些清理工作,例如释放动态分配的内存、关闭文件或者释放一些其它资源等等。防止资源泄漏等问题。

2.析构函数的功能

1.释放动态分配的内存

        当一个对象在其生命周期内分配了内存的时候,我们要确保在对象被销毁的时候释放这些内存是只管重要的,以防止内存泄漏,在C++当中通常使用new关键字进行内存分配,而使用delete关键字进行释放,这涉及到了在对象的析构函数当中执行适当的清理工作。

#include"Yangon.h" class MyClass { private: char* data; public: MyClass(const char* str) { data = new char[strlen(str) + 1]; strcpy(data, str); } ~MyClass() { delete[] data; } void PrintData() { cout << "Data:" << data << endl; } }; int main() { MyClass* obj = new MyClass("Hello World!"); obj->PrintData(); delete obj; return 0; }

        在上面我写的这段代码当中这个类的构造函数使用了new关键字进行了动态内存的分配来定义data数组,我们要知道对象在创建的时候就会立刻调用构造函数进行初始化工作,构造函数当中使用了动态分配就意味着我们的每一个对象在堆当中分配好了内存之后就会有一个data数组,因为每一个对象的初始化都会调用构造函数,但是这些动态分配好的内存必须我们手动释放,对象销毁的时候如果我们不进行手动释放,就会造成内存泄漏,所以我们必须在构造函数当中显式释放这些内存,而对象在销毁的时候会自动调用自己的析构函数,所以我们就必须在析构函数当中显式对应,这样就和构造函数对照起来了。

        这里我多提一嘴,因为有些情况是不需要显式定义析构函数的,析构函数和构造函数一样我们如果不写编译器会自动生成,哪些情况需要我们显式定义析构函数并且在析构函数内部显式地释放资源呢?这具体就要看构造函数当中具体做了什么了,构造函数当中没有明确的定义一些动态内存的话或者没有明确地使用了哪些资源的话,析构函数一般情况下我们是可以不写的。

2.关闭文件或释放资源

        当一个对象在其生命周期内打开了文件,建立了网络连接或者分配其它类似的资源的时候,确保在对象销毁的时候释放这些资源是十分重要的,以免泄漏资源,在C++当中你可以使用析构函数来执行这些清理操作。下面是一个简单的例子。

#include"Yangon.h" #include<fstream> class FileHandler { public: FileHandler(const string& filename) { file.open(filename); if (!file.is_open()) { cerr << "Error: Unable to open file." << endl; } } ~FileHandler() { if (file.is_open()) { file.close(); } } void WriteData(const string& data) { if (file.is_open()) { file << data << endl; } } private: ofstream file; };

        这里我们的构造函数当中打开了一个文件,那么这种情况我们就必须在析构函数当中显式释放这些资源。我们要确保在对象被销毁的时候这些资源被正确地释放。

        最后我再在这里提一嘴,需不需要显式地定义析构函数主要看我们的构造函数里面有没有定义一些我们必须进行释放的内容。注意我上面提到的这些情况是必须显式定义析构函数的,不能依靠默认析构函数。


 二、默认析构函数

        默认析构函数就是我们自己不写然后编译器为我们自动生成的析构函数,这种情况下这样的析构函数其实内部是空的,也就是说默认析构函数内部实现是空的,因为对象内部实在是没有什么需要我们释放的资源。

1.普通内置类型

        对于内置类型,编译器生成的默认析构函数并不执行任何的清理工作,因为内置类型本身并没有什么需要手动释放的资源(内置类型就是我们平常所使用的int、double、char等这些类型)。

2.成员对象类型

       针对成员对象的析构C++的编译器会自动为我们调用析构函数,我们是不需要进行显式调用成员对象的析构函数的,之前我的文章在这里有一些错误,不管一个类是否有默认析构函数还是自定义的析构函数,类的析构函数都会自动地区调用成员对象的析构函数,代码如下:

        

class Member { int age; string name; char* data; public: Member(int age, string name,const char* str) :age(age),name(name) { data = new char[strlen(str) + 1]; strcpy(data, str); cout << "Member()" << endl; } ~Member() { delete[] data; cout << "~Member()" << endl; } }; class Base { private: int age; string name; Member* member; //char* data; public: Base(int age, string name, Member* member) :age(age),name(name),member(member) { //data = new char[strlen(str) + 1]; //strcpy(data, str); cout << "Base()" << endl; } ~Base() { //delete[] data; cout << "~Base()" << endl; } }; int main() { Member* member = new Member(22, "Hello World", "LLL"); std::cout << "============" << std::endl; Base* base = new Base(22, "Hello World", member); delete member; // 在删除 member 之前先删除 base delete base; std::cout << "=============" << std::endl; return 0; }

        我后续的文章会针对成员对象的析构函数单独出一个专题为大家讲解一下析构函数和构造函数的调用顺序,并且结合拷贝构造函数为大家一起讲解。


三、析构函数的注意事项

1.不需要显式调用析构函数

        通常情况下我们不需要显式调用析构函数,因为对象生命周期结束的时候会自动调用成员的析构函数,而不是我们程序员手动调用的,(注意我这里说的可是显式调用不是显式定义千万别误会了)。

2.注意资源管理

        如果在析构函数当中进行资源管理确保在对象的整个生命周期当中都能正确地处理异常和错误情况,一面造成资源泄漏。

3.避免在析构函数当中执行耗时操作

        析构函数应该足够的高效,否则在销毁大量的对象的时候可能会导致性能下降。

析构函数还有很多的注意事项,等到后面讲到多态、异常的时候再为大家详细讲解。


 总结

        析构函数在继承、多态、异常等部分的内容方面还有很多的注意细节,这篇文章就不为大家详细展开了,本文只介绍了析构函数最基础的内容,希望能够帮助到大家。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125795.html

(0)
上一篇 2025-09-24 12:15
下一篇 2025-01-25 17:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信