2017-09-09 9 views
0

how new works in C++上に読んで、私は次のコードを試してみました:C++メンバーに予期しないゼロ初期化が発生するのはなぜですか?

#include <iostream> 

using namespace std; 
struct A { int m; }; // POD 
int main() 
{ 
    A* a = new A; 
    cout<<"A m="<<a->m<<endl; 
    return 0; 
} 

を、出力は常に "M = 0" です。 残存価額が表示されないのはなぜですか?どのようにすることができますか?

追加情報:5.4.0 20160609 on Ubuntu 16.04。 mの-std = C++ 03、98と11の規格

+3

0より42の残差が少なくなる理由は?また、「リリースモード」でコンパイルする必要があります。 – StoryTeller

+1

メンバー変数の内容は* indeterminate *です。これを初期化する以外は、C++の[* undefined behavior *](http://en.cppreference.com/w/cpp/language/ub)です。 –

+0

未定義の動作は定義されていません。それは本当に建設的ではありません。 –

答えて

3

値が指定されていないと、それはあなたの場合のように1337または0可能性がコンパイルしようとしました。これは、0が残余価値ではないことを意味するものではありません(他の数値と同じように残余として存在します)。

実際に起こっていることは、あなたがデバッグでコンパイルしていて、コンパイラが要求したバイト数をゼロにしていることです。

+0

私も-O3フラグを追加しようとしたと同じ結果を得ました編集:それを複数回実行しようとしました –

関連する問題