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

Bil*_*lie 13 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();
}
Run Code Online (Sandbox Code Playgroud)

我运行程序,它什么都没打印.

为什么?

在main中,我创建了new CFoward,并在func我删除它并将其称为析构函数.

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

jro*_*rok 12

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

从n3337,第5.3.5/5段:

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

  • @ user1798362:如果你定义了你的类析构函数(而不仅仅是使用编译器生成的那个),那么这是非常重要的.递归地,如果您的类具有任何具有非平凡析构函数的成员,则您的类具有非平凡的析构函数.所有其他的析构函数都是微不足道的(它们实际上并没有做任何事情). (3认同)