【C/C++析构函数 】C++中的“垃圾回收”机制_析构

简介: 【C/C++析构函数 】C++中的“垃圾回收”机制_析构

C++ 析构函数

📌析构函数是类的另一个特殊成员函数,它的作用与构造函数相反,C++规定析构函数的名字是类的前面加上一个波浪号(~)
析构函数不返回任何值,没有返回类型,也没有函数参数。
由于没有函数参数,因此它不能被重载。换言之,一个类可以有多个构造函数,但是只能有一个析构函数。


析构函数语法格式

~classname()   
{
    /*code */   
}

析构函数执行时机

类析构顺序:1)派生类本身的析构函数;2)对象成员析构函数;3)基类析构函数。

  • 在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。
  • 在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数
  • new 创建的对象位于堆区,通过 delete 删除时才会调用析构函数;如果没有 delete,析构函数就不会被执行

合成析构函数

编译器总是会为类生成一个析构函数,称为合成析构函数。

合成析构函数按照对象创建时的逆序来撤销每个非静态成员,即它是按照成员在类中声明的次序来撤销成员的。

对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。

需要注意,合成析构函数并不删除指针成员所指向的对象,他需要程序员显示地编写析构函数去处理。


虚析构函数

将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏

  • 默认的析构函数非虚函数
    C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。

析构函数的使用

析构函数是C++中一种特殊的成员函数,用于释放对象占用的资源。在程序中,当一个对象的生命周期结束时,其析构函数会被自动调用,用于清理对象的资源。析构函数的主要作用是帮助程序员自动管理对象的资源,避免资源泄漏和内存泄漏的问题。

-析构函数的使用有以下几个方面:

析构函数用于清理对象的资源,例如释放内存、关闭文件等。

在C++中,对象的析构函数是在对象生命周期结束时自动调用的,用于清理对象的资源。通过析构函数,程序员可以自动释放对象占用的资源,避免资源泄漏和内存泄漏的问题。例如,在一个对象中分配了动态内存,可以在析构函数中进行内存释放,以确保内存被正确释放。

可以在析构函数中调用其他函数,以便完成对象的资源清理工作。

除了释放对象占用的资源外,析构函数还可以调用其他函数,以便完成对象的资源清理工作。例如,在一个对象中打开了文件,可以在析构函数中调用文件关闭函数,以确保文件被正常关闭。

当一个对象被删除时,其析构函数会被自动调用。

在C++中,当一个对象被删除时,其析构函数会被自动调用,用于清理对象的资源。例如,在一个函数中创建了一个对象,当函数结束时,对象会被自动销毁,其析构函数也会被自动调用。这样可以保证对象的资源被正确释放,避免资源泄漏和内存泄漏的问题。


综上所述,析构函数是C++中一种特殊的成员函数,用于释放对象占用的资源。通过析构函数,程序员可以自动管理对象的资源,避免资源泄漏和内存泄漏的问题。在使用析构函数时,应该注意释放对象占用的所有资源,并在必要时调用其他函数,以便完成对象的资源清理工作。

析构函数的注意事项

析构函数不能被重载,也不能有返回值

在C++中,析构函数的名称与类名相同,前面加上一个波浪号(~)。析构函数不能被重载,也不能有返回值。这是因为析构函数的调用是由编译器自动完成的,无法通过函数参数或返回值来控制。

析构函数应该释放对象占用的所有资源,防止资源泄漏和内存泄漏

析构函数的主要作用是释放对象占用的资源,例如释放内存、关闭文件等。因此,在编写析构函数时,应该确保对象占用的所有资源都被正确释放,以避免资源泄漏和内存泄漏的问题。

不要手动调用析构函数,否则可能会发生未定义行为

在C++中,析构函数的调用是由编译器自动完成的,无需手动调用。如果手动调用析构函数,可能会发生未定义行为,导致程序崩溃或出现其他异常情况。

子类的析构函数应该调用父类的析构函数,以便完成所有对象的资源清理工作

在继承关系中,子类的析构函数应该调用父类的析构函数,以便完成所有对象的资源清理工作。如果子类的析构函数没有调用父类的析构函数,可能会导致父类的资源没有被正确释放,从而出现资源泄漏和内存泄漏的问题。


综上所述,析构函数是C++中一种特殊的成员函数,用于释放对象占用的资源。在编写析构函数时,应该注意上述几个注意事项,以确保对象的资源被正确释放,避免资源泄漏和内存泄漏的问题。


析构函数与退出

在C++中,对象的析构函数是在对象生命周期结束时自动调用的,用于清理对象的资源。在程序退出时,如果对象的析构函数可以正常执行,会使程序结束的更加优雅。但是,在某些情况下,程序结束时可能无法执行对象的析构函数,这可能会导致一些未被清理的资源泄漏。

下面列举了一些情况,可以正常执行对象的析构函数:

  • 正常退出程序:当程序按照正常的流程退出时,所有的对象的析构函数都会被自动调用,清理对象的资源。
  • 函数调用结束:当一个函数调用结束时,其中的局部对象会被自动销毁,它们的析构函数也会被自动调用。
  • 异常捕获:当程序中抛出异常并被捕获时,所有的对象的析构函数都会被自动调用,清理对象的资源。

对象的生命周期结束:当一个对象的生命周期结束时,它的析构函数会被自动调用,清理对象的资源。例如,当一个对象被从容器中删除时,它的析构函数会被自动调用。

而以下情况下,可能无法执行对象的析构函数:

  • 程序异常终止:当程序因为异常或者信号而异常终止时,对象的析构函数可能无法被自动调用。
  • 程序崩溃:当程序崩溃时,对象的析构函数可能无法被自动调用。
  • 操作系统强制结束程序:当操作系统强制结束程序时,对象的析构函数可能无法被自动调用。

因此,在编写C++程序时,需要注意异常处理和资源管理,尽可能确保对象的析构函数可以被自动调用,避免资源泄漏和内存泄漏的问题。

总结

本文深入探讨了C++编程中this指针的概念、作用和用途。我们首先介绍了this指针的基本原理,然后讨论了其在区分成员变量和局部变量、链式操作实现、作为函数参数或返回值、运算符重载等方面的应用。接下来,我们讨论了const成员函数中的this指针以及它们之间的关系。最后,我们深入了解了this指针在派生类、虚函数等高级主题中的应用,并强调了避免误用this指针的注意事项。
通过阅读本文,您应该已经对C++中的this指针有了更深入的理解。请记住,在编写C++代码时,合理地使用this指针可以帮助您编写更高效、可扩展和易于维护的程序。希望本文能够帮助您提高C++编程技能,并在实际项目中更好地运用this指针。祝您编程愉快!

目录
相关文章
|
11天前
|
设计模式 算法 测试技术
C++ 创建兼容多个IPC机制的上层接口
C++ 创建兼容多个IPC机制的上层接口
62 1
|
6天前
|
编译器 C++
C++程序中的派生类析构函数
C++程序中的派生类析构函数
9 2
|
6天前
|
C++
C++程序中的析构函数
C++程序中的析构函数
8 2
|
11天前
|
C++ Linux
|
11天前
|
编译器 C++
【C++从练气到飞升】03---构造函数和析构函数
【C++从练气到飞升】03---构造函数和析构函数
|
11天前
|
Java 程序员 Python
JVM的垃圾回收机制(GC机制)
Java的JVM实行自动垃圾回收机制(GC),主要针对堆中的对象。当对象无引用可达时,被视为垃圾。垃圾回收包含“找垃圾”和“回收垃圾”两步。找垃圾通过引用计数(非Java使用)和可达性分析(Java使用)来识别无用对象。可达性分析从根对象开始遍历,未被标记的对象视为垃圾。回收垃圾常用标记清除方法,但可能导致内存碎片。此过程消耗资源,且碎片化影响内存分配效率。
17 1
|
11天前
|
存储 编译器 对象存储
【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
7 0
|
11天前
|
编译器 C++
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
|
11天前
|
存储 C++
C++ 异常处理机制详解:轻松掌握异常处理技巧
C++ 异常处理提供结构化错误管理,增强程序健壮性。通过`throw`抛出异常,`try-catch`捕获并处理。示例展示了当年龄小于18时抛出异常。优点包括提高健壮性和代码可维护性,但可能降低性能并复杂化代码。另外,介绍了四种在C++中相加两个数的方法,包括使用运算符、函数、类、STL函数和lambda表达式。
21 0
|
11天前
|
安全 编译器 C++
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性