C++中的析构函数

shr*_*sva 12 c++ destructor

析构函数是否释放分配给它所属对象的内存,或者是否只是调用它以便它可以在编译器释放对象之前执行最后一分钟的内务处理?

bma*_*ies 32

'编译器'不会删除任何内容.它创建了在运行时执行操作的代码.

编写delete somePointer;编译器时,本质上写道:

  if ( has_virtual_destructor( * somePointer  ) ) {
       // virtual dispatch to a compiler-generated function
      dynamic_cast< true_dynamic_type * >(somePointer)->destroy_dynamic_type();
       /* contents of true_dynamic_type::destroy_dynamic_type() {
              this->~true_dynamic_type();
              operator delete( this); // executed within class context
       } */
  } else {
      somePointer->~ClassName();
      operator delete(somePointer);
  }
Run Code Online (Sandbox Code Playgroud)

换句话说,析构函数被调用,然后调用operator delete来释放存储空间.

如果析构函数是虚拟的,则使用虚拟分派以最派生的形式对对象执行整个操作.实现此目的的常用方法是向每个虚拟析构函数添加隐藏参数.

请注意,顶级if语句实际上并不是生成代码的一部分; 编译器在编译时做出决定.