Почему VC++ C4150 (удаление указателя на неполный тип) является только предупреждением?

StackOverflow https://stackoverflow.com/questions/1271307

Вопрос

Конечно, к предупреждению нужно относиться, но почему VС++ С4150 (удаление указателя на неполный тип) только предупреждение?

Это было полезно?

Решение

Потому что стандарт гласит, что это законно, хотя и опасно:5.3.5

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

Другие советы

Вы получаете это предупреждение в результате предварительного объявления.Итак, компилятор распознал, что это структура/класс, но не уверен в вызове деструктора.

Предупреждение, скорее всего, связано со вторым проходом анализа кода с помощью msvc.Когда последний класс разрешен, компилятор может принять решение, существует ли деструктор.

В C++ это разрешено, хотя зачастую это плохая идея.

Грубо говоря, уровень предупреждения 1 относится к типу «вы можете быть удивлены, но я проигнорировал то, что вы там сказали», а также несколько выбранных операторов, в которых сгенерированный код, скорее всего, неверен и подвержен сбоям.

Таким образом, WL 2 подходит, поскольку удаление неполного типа является законным и во многих сценариях совершенно допустимым.

Конечно, это рассуждение — всего лишь обоснованное предположение.Возможно, Microsoft рискнула назначить этот уровень предупреждения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top