前向声明和析构函数之间的关系

时间:2013-07-28 18:40:26

标签: c++ forward-declaration

我有以下代码:

#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中删除了它,并将其称为析构函数。

似乎没有调用析构函数。为什么?无论如何这与前瞻性相关有关吗?

2 个答案:

答案 0 :(得分:12)

实际上,你的前向声明引入了一个不完整的类型,后来用非平凡的析构函数定义,并且不能在删除表达式中使用:

从n3337,第5.3.5 / 5段:

  

5如果要删除的对象在删除时具有不完整的类类型,并且完整的类具有   非平凡的析构函数或释放函数,行为是未定义的。

答案 1 :(得分:1)

是。实际上在函数func中,编译器不知道cForward的完整类型。因此,desctructor被称为。

如果你把这个功能放在课后,它会正常工作。