2016-06-11 7 views
-2

私は、例えば、このタイプのハッシュマップしている場合:Javaベクトルのサイズ変更はC++のように問題がありますか?

HashMap<String,ArrayList<Integer> > tag_posizioni; 
tag_posizioni.put("A",new ArrayList<Integer>()); 
tag_posizioni.get("A").add(3); 

ので、私はAタグに関連付けられている私のArrayListをリサイズしています。だから、私は別のメモリゾーンに新しいベクトルを持っています。 (私の参照が有効でないメモリ領域を指しているので)私の次

tag_posizioni.get("A") 

は、メモリエラーをスローする可能性やJVMは、このような状況は、基準を変更し、自動的に管理しますか? は

ArrayList<Integer> pos=tag_posizioni.get("A"); 
pos.add(3); 
tag_posizioni.put("A", pos); 

をやって、より確かですか役に立たないのですか?このコードでは何も問題はありません

答えて

1

は、あなたが呼び出すとき:

tag_posizioni.get("A").add(3); 

はその後tag_posizioni.get("A")add(3)が呼び出されたオブジェクトへの参照を返します。このオブジェクト(ArrayList)は内部データ構造を変更しますが、internalyは知られていません - カプセル化されています。この内部データ構造への参照を何らかの形で取ることができた場合にのみ、あなたのステートメントは真実になります。

また、ArrayListにalementを追加するとtag_posizioni.get("A")が有効でないメモリを返すかどうかを尋ねると思います。 javaの下では、C++でポインタがぶら下がっているようなものはありません。ヌル参照しかないかもしれません。 tag_posizioni.get("A")で参照されている配列リストのインスタンスは、tag_posizioni HashMapで独自の参照を変更しません。

std::unordered_map<std::string, std::vector<int>>を使用すると、std::vector<int>に要素を追加すると、ベクトルのメモリをさらに割り当てることができますが、バッファを再割り当てするプロセス全体がカプセル化されます。しかし、C++では、実際には内部的なベクトルメモリへのポインタを取ることはできませんが、これはあまり賢明ではありません。その結果、未定義の動作が発生する可能性があります。

関連する問題