4

intまたはなどの基本的なC++タイプのfloat初期値が不明になるのはいつですか。

仮にあったとしても、メモリ割り当てのタイプはどのように考慮されますか?宣言はどうですか?class//のメンバーである場合はどうなりますstructunion?C++11はC++03またはC++98とは異なりますか?

私には疑いがありますが、私の知識が完全であるかどうか(または、それに関しては正しいかどうか)はわかりません

4

2 に答える 2

7

次の場合、 PODデータ(すべての基本タイプを含む)の値は不明になります。

  • 静的メモリ割り当てはありません(代わりにスタック上またはで作成されますnew
  • 空の初期化および/またはコンストラクタ初期化リストを含め、初期化されていません

すべてのタイプのグローバル/静的変数は、mainが呼び出される前の起動プロセスの一部としてゼロに設定されます。main コンストラクターは、 1より前にコンストラクターを持つ型に対して呼び出されます。

コンストラクターで初期化されていないものも不明です。

編集:明確にするために、std::stringこれは「コンストラクタがすべてを初期化していない」の良い例です-ローカルがある場合std::string str;str、定義された「空の文字列」コンテンツがありますが、実際のバッファのコンテンツ、または実際にバッファが指しているもの意味のあるものに設定しないでください。実装では、長さ[またはその他の方法]に基づいて、文字列を使用してデータを格納し始めたら、使用可能なバッファがあるかどうかを判断できます]。

Edit2:コメントで説明されているように、構造の一部が初期化される「ハイブリッド」の場合もあります。たとえば、struct「プレーンデータ」の要素とコンストラクターを持つ要素が含まれます。コンストラクターを持つものは、コンストラクターが呼び出されます。プレーンデータは初期化されません。

1コンストラクターを実行するコードは、「main」関数の一部であるか、内部から呼び出される可能性がありますが、その場合は、「mainのコードが開始される前」になります。

于 2013-02-08T22:17:41.037 に答える
2

「WorkingDraftC++、2012-11-02」から

3.6.2非ローカル変数の初期化[basic.start.init]
2静的ストレージ期間(3.7.1)またはスレッドストレージ期間(3.7.2)の変数は、他の初期化が行われる前にゼロ初期化(8.5)されるものとします。 。

静的ストレージを持つ変数は、少なくともゼロで初期化されます。

3.7.3自動保存期間[basic.stc.auto]
2[注:これらの変数は、6.7で説明されているように初期化および破棄されます。—エンドノート]

6.7は、自動変数がどのように初期化されるかについては何も述べていません。

3.7.4動的ストレージ期間[basic.stc.dynamic]
...
3.7.4.1割り当て関数[basic.stc.dynamic.allocation]
...割り当て関数から戻ったときに割り当てられたストレージの内容に制約はありません。 。割り当て関数の連続呼び出しによって割り当てられるストレージの順序、隣接性、および初期値は指定されていません。

8.5イニシャライザー[dcl.init]
7タイプTのオブジェクトをデフォルトで初期化するということは、次のことを意味
します。 -Tにアクセス可能なデフォルトコンストラクタがない場合に形成されます);
— Tが配列型の場合、各要素はデフォルトで初期化されます。
—それ以外の場合、初期化は実行されません。

明示的な初期化子を指定すると、すべての変数に既知の値が割り当てられます。

PODタイプの明示的な初期化子を提供しない場合、それはストレージクラスに依存します。静的変数またはスレッド変数はゼロで初期化されますが、自動または動的に割り当てられた変数は初期化されません。

複合型を使用している場合は、同じ規則が適用されます。(デフォルトの)コンストラクターなどを介して明示的な初期化子がない場合、基本型の初期値はストレージクラスによって異なります。

最後に、によって割り当てられたメモリは初期化されませんmallocが、callocメモリはゼロで初期化されます。

于 2013-02-08T22:40:27.847 に答える