Связь между декларацией 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
я удалил его и назвал его деструктором.
Кажется, деструктор не был вызван. Зачем? Связано ли это с форвардным выражением?
Ответы
Ответ 1
В самом деле, ваше форвардное объявление вводит неполный тип, который позже определяется с нетривиальным деструктором и который не может использоваться в выражении удаления:
Из n3337, пункт 5.3.5/5:
5 Если удаляемый объект имеет неполный тип класса в точке удаления, а полный класс имеет нетривиальный деструктор или функция освобождения, поведение не определено.
Ответ 2
Да. Фактически в функции func компилятор не знает полного типа cForward. Таким образом, дескриптор не называется.
Если вы поместите функцию после класса, она будет работать нормально.