2017-03-23 2 views
0

Ich bemerkte, dass MSVC2015 Datenelement initialisiert, das unbestimmt bleiben sollte. Codebeispiel und Ergebnisse:MSVC2015 initialisiert Klassenelement, das nicht initialisiert werden soll

class A 
{ 
public: 
    int i; 
}; 

class B 
{ 
public: 
    B(){} 
    int i; 
}; 

class C 
{ 
public: 
    int i; 
    virtual void vf(){} 
}; 

int main() 
{ 
    A a;  
    B b;  
    C c; 

    a.i;  //error C4700 uninitialized local variable used 
    b.i;  //ok 
    c.i;  //ok 
} 

, wenn ich es richtig verstanden habe, in den beiden 1, 2, 3 Fälle, Mitglied sollte i Standard initialisiert werden, die nichts für Nicht-Klasse-Typ tut, sollte der Fehler ausgegeben für alle drei Fälle. Stimmt mein Verständnis hier?

Durch Überprüfen der Assembly wird ein Memset im Konstruktor generiert, um Null-Klassenmitglieder, warum VS dies tut? Nach meinem Verständnis sollte die Semantik des impliziten Standardkonstruktors der Klasse X mit X() {} übereinstimmen, ist das richtig?

Und durch das Hinzufügen von virtuellen Funktionen ist der implizite Konstruktor nicht mehr trivial, aber ich weiß nicht, welchen Unterschied es gibt, wenn ein ctor trivial ist oder nicht.

+2

Das Lesen nicht initialisierter Daten ist ein undefiniertes Verhalten, so dass VS alles tun kann, was es will. Während des Debugs versucht es, hilfreich zu sein, indem es Variablen auf Null setzt und Warnungen und Fehler gibt, wenn Sie in Ihrem Code undefiniertes Verhalten haben, aber es fängt nicht alles ein. – nwp

+0

Lets versuchen a.i = 0; stattdessen a.i; :) –

Antwort

1

Der Compiler-Schalter /sdl könnte die Ursache sein. Dies ist eine Sicherheitsfunktion, die Speicher auf Null setzt.

Blick in Projektionseigenschaften -> C++ -> Allgemein -> SDL prüft

auch Sicherheits-Check (/GS) in Projektionseigenschaften siehe -> C++ -> Code-Generierung.

Deaktivieren Sie beide und sehen Sie, was passiert.

Verwandte Themen