13

我有以下代码:

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

似乎没有调用析构函数。为什么?这与前向减速有关吗?

4

2 回答 2

12

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

从 n3337,第 5.3.5/5 段:

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

于 2013-07-28T18:43:51.767 回答
1

是的。实际上在函数func中,编译器并不知道cForward的完整类型。所以 descstructor 不会被调用。

如果你把函数放在类之后,它会正常工作。

于 2013-07-28T18:46:36.180 回答