Подтвердить что ты не робот

Связь между декларацией Forward и деструкторами

У меня есть следующий код:

#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 я удалил его и назвал его деструктором.

Кажется, деструктор не был вызван. Зачем? Связано ли это с форвардным выражением?

4b9b3361

Ответ 1

В самом деле, ваше форвардное объявление вводит неполный тип, который позже определяется с нетривиальным деструктором и который не может использоваться в выражении удаления:

Из n3337, пункт 5.3.5/5:

5 Если удаляемый объект имеет неполный тип класса в точке удаления, а полный класс имеет нетривиальный деструктор или функция освобождения, поведение не определено.

Ответ 2

Да. Фактически в функции func компилятор не знает полного типа cForward. Таким образом, дескриптор не называется.

Если вы поместите функцию после класса, она будет работать нормально.