Есть ли в реальной жизни случаи, когда удаление неполного типа не является ошибкой в ​​C++?

В Visual C++ есть предупреждение C4150 для случаев, когда delete применяется к указателю на неполный тип.

Такие случаи приводят к неопределенному поведению в соответствии со Стандартом. Насколько я знаю, в Visual C++ они приводят к функции operator delete() по умолчанию, а деструктор не вызывается, что допускает многочисленные ошибки.

Теперь я мог бы использовать #prarma warning( error : 4150 ) в Visual C++, чтобы интерпретировать это предупреждение как ошибку. Я предполагаю, что есть причины, по которым это предупреждение, а не ошибка по умолчанию в Visual C++.

В каком коде реальной жизни я хотел бы разрешить такие случаи? Почему бы мне не переключить это предупреждение на ошибку компилятора?


person sharptooth    schedule 27.10.2011    source источник
comment
Считается ли void неполным типом? Если да, это может иметь значение. :)   -  person Xeo    schedule 27.10.2011
comment
Вы никогда не можете знать, что Microsoft имела в виду со своими продуктами.   -  person Dani    schedule 27.10.2011
comment
Возможно, класс с тривиальным деструктором?   -  person Alok Save    schedule 27.10.2011
comment
Я смутно припоминаю, что наша команда по разработке продукта столкнулась с ошибкой в ​​более старой версии компилятора, где для этой ошибки вообще не генерировалось никаких предупреждений. Для производственного кода, почему бы просто не установить флаг так, чтобы ВСЕ предупреждения были ошибками, а затем использовать прагму для отключения предупреждений, которые вы считаете безобидными?   -  person selbie    schedule 27.10.2011


Ответы (2)


Это не всегда УБ.

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

person Cat Plus Plus    schedule 27.10.2011
comment
Кхм. Точно мое ощущение (в комментарии)! класс с тривиальным деструктором не должен вызывать UB. - person Alok Save; 27.10.2011

Как насчет того, чтобы указатель был 0 (или nullptr в C++11)? delete 0; по определению не работает.

person Xeo    schedule 27.10.2011
comment
Считается ли 0 неполным типом? - person Alok Save; 27.10.2011
comment
@Als: Нет, но struct s; s* p = 0; delete p; знает. Я просто хотел подчеркнуть, что это то же самое, что и delete 0;. - person Xeo; 27.10.2011
comment
Ах, хорошо.. Конечно, это пограничный случай, когда тип является указателем Incomplete Opaque, но он указывает на 0, поэтому deleteing это No-Op. - person Alok Save; 27.10.2011
comment
@Als: см. мой связанный вопрос в комментарии к ОП, похоже, есть некоторые разногласия. :) Edit: только что увидел, что вы уже прокомментировали этот вопрос, когда я впервые его задал, тогда nvm. :D - person Xeo; 27.10.2011
comment
Да, AFAIU, удаление указателя типа void* является UB, но в вашем примере p имеет тип struct, а не void*, так что это законный пограничный случай. - person Alok Save; 27.10.2011