2011-08-25 50 views
9

ポインタの配列の初期化に問題がありました。私はGCCのC++(4.6.0)でコンパイルを発見することである:C++ポインタ配列の初期化ヘルプ

MyClass** a = new MyClass*[100]; 

は常にポインタの配列をinitalizeません。

MyClass** a = new MyClass*[100](); 

(それは私に私を混同してはnullポインタの配列を与えなかったほとんどの時間)が0(NULLポインタ)に、アレイ内のすべてのポインタを初期化しません。

私が書いているコードは、Windows/Linux/Mac/BSDプラットフォーム間で移植可能であることを意図しています。これはgcc C++コンパイラの特別な機能ですか?それとも標準的なC++ですか?標準のどこにそう言いますか?

+0

は、おそらくあなたは、 ')(' MyClassの** A =新しいMyClassの* [100]を意味します。はい、 '新しい'初期化子は標準的な機能です。私はちょうど重複した質問を探しています。 –

+0

なぜそうではないのですか(理由は間違っています)理由を尋ねるので、それほど重複しません:http://stackoverflow.com/questions/6717246/no-array-allocated-using-new-can-have-an-initializer ..しかし、十分に近い。投票を終了する。 –

+0

最初のバージョンでは初期化されていないメモリが返されますが、これは以前は使用されていなかった場合はもちろんNULL *になります。ほとんどのOSは、セキュリティ上の理由から、プロセスに割り当てられたメモリをクリアします。 –

答えて

5

この値の初期化は標準のC++です。

関連する標準は、C++ 98およびC++ 03§5.3.4/ 15にあります。 C++ 98では、C++ 03以降はデフォルト初期化でしたが、それは値の初期化です。あなたのポインタについては、どちらもゼロ初期化に減少します。

C++ 03§5.3.4/ 15:

新しい初期フォーム()である場合、アイテムは値初期化(8.5)です。 C++ 0xので

その段落ではなく“にN3290(FDIS)であなたは8.5/16で同じ文言について見つける直接初期化”、8.5の初期化ルールを参照します。

乾杯& HTH。、

+0

すばらしい答え!私が望んでいたExaclty。私はデフォルト/値/ゼロを自信を持って初期化できるようになりました。 –