c++ - 前向声明与析构函数的关系

  显示原文与译文双语对照的内容
0 0

我有以下代码:

#include <iostream>
using namespace std;
class CForward;
void func(CForward* frw) { delete frw; }
class CForward
{
public:
    ~CForward() { cout << "Forward" << endl; }
};
int main()
{
    func(new CForward);
    cin.get();
}

我运行程序,用什么打印。

为什么?

main中,我创建 new CFoward,然后在 func已删除它并调用它的析构函数。

似乎析构函数没有被调用。 为什么? 是相关无论如何到forward decleration?

时间:原作者:6个回答

0 0

实际上,你前向声明引入一个不完全类型,随后将定义为非trivial析构函数,并且无法删除表达式中使用:

从n3337第五款.3 .5/5:

5 如果对象被删除不完全类类型的点处删除和完整的类有非trivial析构函数或解除分配函数,行为是undefined 。

原作者:
0 0

是的 事实上在函数func中,编译器不知道整个cForward的类型。 所以desctructor neved叫。

如果你把函数后,该类会正常工作。

原作者:
...