2017-03-23 20 views
0

私は、MSVC2015が不確定であるべきデータメンバーを初期化することに気付きました。 コードサンプルと結果:MSVC2015は初期化されていないクラスメンバーを初期化する

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 
} 

私はそれを正しく理解すれば、両方の1、2、3例では、私は非クラス型のために何もしていないデフォルト初期化し、あるべきメンバー、エラーが発行されなければなりませんすべての3つのケースについて。私の理解はここで正しいのですか?

アセンブリをチェックすると、VSがこれを行う理由は何ですか?メンバはゼロのクラスメンバにコンストラクタで生成されますか?私の理解では、クラスXの暗黙のデフォルトコンストラクタのセマンティックはX(){}と同じでなければなりません、そうですか?

仮想関数を追加することで、暗黙的なコンストラクタはもはや簡単なことではなくなりましたが、ctorが自明でないかどうかは分かりません。

+2

初期化されていないデータの読み込みは未定義の動作であるため、VSは必要な処理を実行できます。デバッグ時には、変数をゼロに初期化し、コード内で未定義の動作があるときに警告とエラーを出すことで役立ちますが、すべてをキャッチしません。 – nwp

+0

a.i = 0を試してみましょう。代わりにa.i; :) –

答えて

1

コンパイラスイッチ/sdlが原因である可能性があります。これはメモリをゼロにするセキュリティ機能です。

投影プロパティでルック - > C++ - >一般 - > SDLチェック

また、投影のプロパティでセキュリティチェック(/GS)を参照してください - > C++ - >コード生成。

両方を無効にして何が起こるかを確認してください。

関連する問題