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

The relation between Forward declaration and destructors

本文关键字:关系 之间 析构函数 声明 Forward      更新时间:2023-10-16

我有以下代码:

#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();
}

我运行了这个程序,但它什么也没打印。

为什么?

大体上,我创建了new CFoward,在func中,我删除了它并称之为析构函数。

似乎还没有调用析构函数。为什么?这与远期减仓有关吗?

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

来自n3337,第5.3.5/5段:

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

是。事实上,在函数func中,编译器并不知道cForward的完整类型。因此,解构主义者从未被称为。

如果你把函数放在类之后,它会很好地工作。