Удалить объекты неполного типа - PullRequest
25 голосов
/ 01 декабря 2010

Это заставило меня задуматься:

class X;

void foo(X* p)
{
    delete p;
}

Как мы можем delete p, если мы даже не знаем, есть ли у X видимый деструктор? g ++ 4.5.1 выдает три предупреждения:

warning: possible problem detected in invocation of delete operator:
warning: 'p' has incomplete type
warning: forward declaration of 'struct X'

А потом он говорит:

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

Ух ты ... нужны ли компиляторы для диагностики этой ситуации, как это делает g ++? Или это неопределенное поведение?

Ответы [ 3 ]

21 голосов
/ 01 декабря 2010

Из стандартного [expr.delete]:

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

Итак, это UB, если есть нетривиальные вещи, которые можно сделать, и это нормально, если нет.Предупреждения необязательны для UB.

6 голосов
/ 01 декабря 2010

Это неопределенное поведение.

Однако вы можете проверить компилятором неполные типы, такие как boost:

// verify that types are complete for increased safety

template<class T> inline void checked_delete(T * x)
{
    // intentionally complex - simplification causes regressions
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x;
}

Применение sizeof к неполному типу должно вызвать ошибку, и я предполагаю, что если это пройдет с каким-то компилятором, то массив отрицательного размера вызовет ошибку.

3 голосов
/ 01 декабря 2010

Это неопределенное поведение и распространенная ошибка при реализации шаблона pImpl.Насколько я знаю, просто нет такого понятия, как предупреждение, которое должен выдавать компилятор.Предупреждения являются выборными;они там, потому что автор компилятора думал, что они будут полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...