21xrx.com
2025-04-17 00:32:28 Thursday
文章检索 我的文章 写文章
C++析构函数的执行顺序
2023-07-05 00:24:18 深夜i     13     0
C++ 析构函数 执行顺序

C++是一门非常强大且广泛使用的编程语言。其中,类是C++的重要组成部分。在类中,除了成员函数和成员变量外,析构函数也是非常重要的一部分,用于释放对象在创建时申请的资源。我们都知道,构造函数是在对象创建时自动调用的,但是析构函数呢?在这篇文章中,我们将讨论C++析构函数的执行顺序。

首先,我们需要知道析构函数什么时候被调用。析构函数是为了在对象销毁时执行必要的清理工作而设计的。它会在以下情况下被调用:

1. 对象在离开其作用域时被销毁;

2. 对象被delete运算符删除时被销毁;

3. 在程序终止时,所有未被释放的内存都会被系统回收,因此所有对象都会被销毁,析构函数也会被调用。

那么,C++中析构函数的执行顺序是什么样的呢?以下是一些常见的情况和解释:

1. 若有继承关系,先执行派生类的析构函数,再执行基类的析构函数。这是因为,当一个派生类的对象被销毁时,它的基类部分也需要被销毁,因此基类的析构函数需要先于派生类的析构函数执行。

2. 在对象中,成员变量和成员对象的析构函数的执行顺序是与它们在类中的声明顺序相反的。比如:

class A {
public:
  A() cout << "A ctor" << endl;
  ~A() cout << "A dtor" << endl;
};
class B {
public:
  B() cout << "B ctor" << endl;
  ~B() cout << "B dtor" << endl;
};
class C {
public:
  C() cout << "C ctor" << endl;
  ~C() cout << "C dtor" << endl;
private:
  A a_;
  B b_;
};
int main()
  C c;
  return 0;
// Output:
// A ctor
// B ctor
// C ctor
// C dtor
// B dtor
// A dtor

从以上代码可以看出,当对象被销毁时,其成员变量和成员对象的析构函数是按照它们在类中声明的相反顺序执行的。

3. 当在一个块中创建的局部对象要被销毁时,它的析构函数就会被调用。但是,如果程序异常退出,那么析构函数将不会被执行。比如:

class Test {
public:
  Test() cout << "Test ctor" << endl;
  ~Test() cout << "Test dtor" << endl;
};
void foo() {
  Test t;
  throw exception();
}
int main() {
  try {
    foo();
  }
  catch (...)
    cout << "exception caught" << endl;
  
  return 0;
}
// Output:
// Test ctor
// exception caught

从以上代码可以看出,当抛出异常时,foo函数中的局部变量t将不再存在,析构函数也没有被执行。

总的来说,C++中析构函数的执行顺序是非常重要的。了解它可以帮助我们更好地释放资源,避免内存泄漏等问题。但是,在编写代码时应该注意不要在析构函数中抛出异常,否则程序可能因为未处理的异常而崩溃。

  
  

评论区