Почему VC++ C4150 (удаление указателя на неполный тип) является только предупреждением?
-
13-09-2019 - |
Вопрос
Конечно, к предупреждению нужно относиться, но почему VС++ С4150 (удаление указателя на неполный тип) только предупреждение?
Решение
Потому что стандарт гласит, что это законно, хотя и опасно:5.3.5
Если удаляемый объект имеет неполный тип класса в точке удаления, а полный класс имеет нетривиальный деструктор или функцию Deallocation, поведение не определен.
Другие советы
Вы получаете это предупреждение в результате предварительного объявления.Итак, компилятор распознал, что это структура/класс, но не уверен в вызове деструктора.
Предупреждение, скорее всего, связано со вторым проходом анализа кода с помощью msvc.Когда последний класс разрешен, компилятор может принять решение, существует ли деструктор.
В C++ это разрешено, хотя зачастую это плохая идея.
Грубо говоря, уровень предупреждения 1 относится к типу «вы можете быть удивлены, но я проигнорировал то, что вы там сказали», а также несколько выбранных операторов, в которых сгенерированный код, скорее всего, неверен и подвержен сбоям.
Таким образом, WL 2 подходит, поскольку удаление неполного типа является законным и во многих сценариях совершенно допустимым.
Конечно, это рассуждение — всего лишь обоснованное предположение.Возможно, Microsoft рискнула назначить этот уровень предупреждения.