[C++11: 12.4/11]:
析构函数会在如下情况下被隐式调用:
- 对于那些具有静态存储期(3.7.1)的已构造对象,它们在程序结束时(3.6.3)被销毁。
- 对于那些具有线程存储期(3.7.2)的已构造对象,它们在所属线程结束时被销毁。
- 对于那些具有自动存储期(3.7.3)的已构造对象,在创建这些对象的块退出时(6.7)被销毁。
- 对于那些临时对象,在其生命周期结束时(12.2)被销毁。
- 对于那些通过new-expression(5.3.4)分配的已构造对象,在使用delete-expression(5.3.5)删除时被销毁。
- 在多种异常处理场景下也可能被销毁(15.3)。
如果声明了一个类对象或数组对象,而该类的析构函数不可访问,则程序是不合法的。析构函数还可以显式地调用。
那么为什么这个程序可以编译成功?
#include <iostream>
struct A
{
A(){ };
~A() = delete;
};
A* a = new A;
int main() {}
// g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
GCC只是宽容吗?
我倾向于这样说,因为它拒绝了以下内容,但标准似乎没有特定规则适用于继承层次结构中的已删除析构函数(唯一与之有关的措辞与默认的默认构造函数的生成有关):
#include <iostream>
struct A
{
A() {};
~A() = delete;
};
struct B : A {};
B *b = new B; // error: use of deleted function
int main() {}
A
的对象或数组。 - Kerrek SB