c++ - 在什么情况下,c++的析构函数不会被调用?

标签 c++ call destructor

<分区>

在 C++ 中,我们喜欢在析构函数中做一些事情。但是在什么样的情况下,析构函数不会被调用呢?

以下情况的例子:

  1. exit() 在线程中调用
  2. 未处理的异常并退出
  3. TerminateProcess()(在 Windows 中)
  4. 暖/冷重启计算机
  5. 电脑突然没电了...

最佳答案

这是每个 C++ 程序员都应该知道的一种情况:

#include <stdio.h>

class EmbeddedObject {
   private:
      char *pBytes;
   public:
      EmbeddedObject() {
         pBytes = new char[1000];
      }
     ~EmbeddedObject() {
         printf("EmbeddedObject::~EmbeddedObject()\n");
         delete [] pBytes;
      }
};

class Base {
  public:
    ~Base(){
       printf("Base::~Base()\n");
  }
};

class Derived : public Base {
   private:
      EmbeddedObject emb;
   public:
      ~Derived() {
         printf("Derived::~Derived()\n");
      }
};


int main (int argc, const char * argv[])
{
  Derived *pd = new Derived();
  // later for some good reason, point to it using Base pointer
  Base* pb = pd;
  delete pb; 
}

~Base() 将被调用,但 ~Derived() 不会。这意味着 ~Derived() 中的代码不会执行。它可能必须做一些重要的事情。此外,EmbeddedObject 的析构函数本应自动调用,但并未自动调用。因此,EmbeddedObject 没有机会释放其动态分配的数据。这会导致内存泄漏。

解决方案,在Basevirtual中构造析构函数:

class Base {
  public:
    virtual ~Base() {
    }   
};

对上述程序进行这一更改意味着所有析构函数都将按以下顺序调用:Derived::~Derived()EmbeddedObject::~EmbeddedObject() , Base::~Base()

阅读一般的析构函数。与您提到的其他情况相比,这些问题更可能是您关心的问题。例如,在断电的情况下,安全清理的所有赌注通常都会落空!

在 C++ 中,我们可以很好地控制按照我们希望的顺序执行析构函数的调用,这是个好消息。然而,在您编写的程序中,如果您不够小心,您的对象有可能被泄露并且根本没有被删除。

关于c++ - 在什么情况下,c++的析构函数不会被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8733894/

相关文章:

c++ - 使用 OpenSSL API 准备 secret 文件以解密 Wireshark 中的 TLS 1.3 流量

C++: std::ifstream ifs(路径), 'path should be a constant'

c++ - 该结构的大小

function - 在 PowerShell ISE 中调用函数

c++ - 使用析构函数时清除成员变量

c++ - 在构造函数之后立即调用析构函数

c++ - eclipse 太阳神 - "cannot run program make; unknown reason"

c - 如何用C语言调用ML接口(interface)(函数)

java - 从 Android 中的非 Activity 类调用方法

java - Java有析构函数吗?