【发布时间】:2015-01-15 04:25:15
【问题描述】:
考虑以下代码:
#include <iostream>
struct A
{
A(){ };
~A(){ std::cout << "~A::A()" << std::endl; };
};
struct B: A { };
B *b = new B; //Doesn't produce any side-effect.
int main(){ }
程序不产生任何输出,这意味着没有调用析构函数。但是如果我们用delete 说明符替换析构函数的主体,程序甚至不会编译。
#include <iostream>
struct A
{
A(){ };
~A() = delete; //{ std::cout << "~A::A()" << std::endl; };
};
struct B: A { };
B *b = new B; //Error: use of deleted function
int main(){ }
由于调用了已删除的函数。这就是在这种情况下被调用的析构函数。为什么会有这样的差异?
即使我们显式定义B的构造函数也行不通:
#include <iostream>
struct A
{
A(){ };
~A() = delete; //{ std::cout << "~A::A()" << std::endl; };
};
struct B: A
{
B(){ };
};
B *b = new B;
int main(){ }
【问题讨论】:
-
如果您使用
new分配但从不使用delete解除分配,则不会调用析构函数。 -
另外,如果您更仔细地阅读演示的输出;该错误是由调用已删除的 constructor 引起的
-
@CoffeeandCode main.cpp:9:12: error: use of deleted function 'A::~A()' 这正是析构函数,而不是构造函数。
-
为什么是-1?这是一个非常有趣的问题,简单明了,我非常想知道正确答案(我发布了一个但不是 100% 确定我答对了)。
-
析构函数是被调用还是可能被调用是两个完全不同的问题。在您的演示代码中,由于显而易见的原因,没有调用析构函数。但是,为了使代码可编译,基类析构函数 A::~A() 仍然必须存在。因此,如果您使用 'deletel' 说明符显式删除该函数,它不会编译,尽管没有被调用。
标签: c++ c++11 destructor