2011-02-09 3 views
2

に割り当てられていないとき、私はこのようなものを持っている:挙動[]は何もマッピングされた値がキー

gcccpluplus.comのドキュメントで
#include <iostream> 
#include <map> 

int main() { 

    std::map<int, int*> mapaString; 
    int* teste = mapaString[0]; 
    std::cout << teste << std::endl; 
    if(!teste) 
     mapaString[0] = new int(0); 

    std::cout << mapaString[0] << std::endl; 
    std::cout << mapaString[1] << std::endl; 

    return 0; 
} 

それだけの要素のデフォルトコンストラクタと呼ばれること言われていますしかし、ポインタを初期化せずに宣言すると、その値は未定義になります。

キーに割り当てられた値が割り当てられておらず、戻り値の型がポインタの場合に、添え字演算子([])を呼び出すときに返される値がNULLポインタになることは保証されていますか?

+2

この質問に似て:http://stackoverflow.com/questions/936999/what-is-the-default-constructor-for-c-pointer – TheUndeadFish

+0

@TheUndeadFishはい、本質的に等しいです。ありがとう、私はマップコンテナだけを調査していた。 – coelhudo

答えて

10

プリミティブ型(ポインタを含む)の「デフォルトコンストラクタ」は、グローバル変数と同様に、0で満たされたメモリを生成します。ここ

は(dcl.initから)関連標準言語である:

は タイプTのオブジェクトを初期化するデフォルトの意味:

をT非PODクラス型である--if (クラス)の場合、 Tのデフォルトのコンストラクタが呼び出されます(Tに がない場合は初期化が正しく行われません)。デフォルトのコンストラクタは です。

- Tが配列型の場合、各 要素はデフォルトで初期化されます。

- それ以外の場合、 オブジェクトのストレージはゼロで初期化されます。

...

7その初期括弧の 空集合である、すなわちオブジェクト、()、
はデフォルト初期化しなければなりません。 lib.map.accessからまた

、[lib.map.access]

参照演算子[](CONST key_type & X)

23.3.1.2マップ要素へのアクセス;

戻り値: (*((make_pair(x、T())))。

-1

初期化されていない変数と同じように、これが適切に初期化されるとは想定できません。それは私はおそらくこれを行うだろうなど、あなたのビルド、リリースまたはデバッグ、コンパイラ、お使いのプラットフォームに依存します:

if(mapaString.find(key) == mapaString.end()) { mapaString[0] = 0; } 

次に、あなたがキーのポインタは0/NULLに初期化されたことを確認することができます。

+0

実際には、基本型をnull/0に初期化する値で初期化されます。また、 'find'と' [] 'を実行することで、' map'を2回検索することができます。これは避けることができます。 –

+0

Ah。私はちょうど初期化されていないバグに何度も噛まれました、私はこれも同様に関係していると思っていました。 – terloon

関連する問題