析构函数是用来在编译器释放对象之前执行一些最后时刻的清理工作,它是否会释放分配给对象的内存取决于对象的实现。
析构函数是用来在编译器释放对象之前执行一些最后时刻的清理工作,它是否会释放分配给对象的内存取决于对象的实现。
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);
}
换句话说,析构函数被调用,然后operator delete被调用以释放存储空间。operator delete
查找的工作方式,实际上是从“负责”的虚拟析构函数中调用了delete
。如果不提及这一点,在分析跟踪时可能会令人困惑。) - Potatoswatterif (has_virtual_destructor…
在运行时是 不会 被执行的。编译器 可以为每种类型(因此仅取决于 静态 类型)决定它是否具有虚拟或非虚拟析构函数,并为两种情况发出适当的代码。不确定在尝试 delete
一个 void*
时会发生什么,但我猜测这将是未定义行为。 - Konrad Rudolph析构函数被调用以让对象执行清理操作,以及销毁对象本身创建的任何其他对象。
在析构函数完成后,操作系统将处理释放对象本身的工作。
1) 析构函数不属于对象,而属于类。
2) 它会调用其类中的所有自定义类型(类对象)的析构函数。
3) 清理是可选的活动,只有在真正需要时才进行。
在析构函数退出后,内存将被释放,并在执行返回到“delete”调用或对象实例超出范围的点之前进行。理论上可以设置不同的内存管理器来处理new和delete,但这将是显式更改默认行为。
delete
的作用。这就带我们来到了析构函数 - 如果您在类中创建对象,则析构函数允许您在类离开作用域时删除它们。它让您“在离开时关闭灯”。对于初学者而言,有一些例外是不必首先关注的。其中之一是当对象及其容器被编程为使用引用计数时,所引用的对象直到最后一个引用它的对象释放它之前并不会真正释放。另一个例外是在“放置 new”情况下。