4

std::map の場合、コンテナーのサイズを変更する必要があり、メモリが利用できない場合、挿入はどのように動作しますか?

4

3 に答える 3

6

STL マップはコンテナーを「サイズ変更」する必要はありません。マップ (リストと同様) はノード ベースのコンテナーです。挿入ごとにメモリが割り当てられます。

つまり、メモリ不足の状況は、C++ の他のメモリ不足の状況と同じように処理されます。つまり、std::bad_alloc がスローされます。デフォルトのアロケーターを持つ STL コンテナーは、派手なことは何もしません。それらはすべて、何らかの形で標準の new/delete 演算子を介して割り当てられます。

STL マップの場合、例外がスローされ、それ以外の場合は呼び出されなかったかのように動作します。つまり、コンテナーは変更されません。

于 2008-09-19T18:56:11.957 に答える
0

ニルスの答えを拡張するには(はい、スローします)、スローしたときに何が起こるかは、仕様で混乱することがあります。

仕様の 17.2.2 (マップ/例外に関して) では、insert() がスローされた場合、その関数は効果がありません。これはマップの強力な保証です。これは、vector や deque などの連続した割り当てを使用するコンテナーとは異なります。

于 2008-09-19T19:00:24.223 に答える
0

New は例外をスローします。そのように簡単です。

挿入は行われず、ディクショナリの内容が変更されたり破損したりすることもありません。

于 2008-09-19T18:53:00.420 に答える