Warum ist VC ++ C4150 (Streichung des Zeigers auf einen unvollständigen Typ) nur eine Warnung?
-
13-09-2019 - |
Frage
Natürlich Warnung muss behandelt werden, aber Warum ist VC ++ C4150 (Streichung des Zeigers auf einen unvollständigen Typ) nur eine Warnung?
Lösung
Weil Standard sagt, es ist legal, obwohl gefährlich: 5.3.5
Wenn das Objekt gelöscht hat unvollständiger Klassentyp an der Stelle der Löschen und die komplette Klasse hat eine nicht-triviale destructor oder Freigabe-Funktion ist das Verhalten nicht definiert.
Andere Tipps
Sie erhalten diese Warnung als Ergebnis der Vorwärtsdeklaration. So Compiler hat erkannt, dass es Struktur / Klasse ist, aber nicht sicher Aufruf von destructor.
Sense of Warnung möglichst mit zweitem Durchlauf des Codes betroffen analysiert msvc. Wenn letztere Klasse aufgelöst wird Compiler kann eine Entscheidung treffen, wenn destructor vorhanden ist.
Es ist legal in C ++, obwohl oft genug eine schlechte Idee.
Grob Warnstufe 1 sind der „Sie überrascht sein könnte, aber ich ignorierte, was Sie sagte, es gebe“ Typ, und einige ausgewählte Aussagen, wo der erzeugte Code sehr wahrscheinlich falsch und absturzanfällig ist.
So WL 2 ist angemessen, da es legal ist und in vielen Szenarien völlig ok einen unvollständigen Typen zu löschen.
Natürlich ist diese Argumentation nur eine Vermutung. Vielleicht rollte Microsoft die Würfel diese Warnstufe assigne.