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语句实际上并不是生成代码的一部分; 编译器在编译时做出决定.
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |