21

次の点を考慮してください。

std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);

ベクトルで再割り当てが発生し、それが失敗した場合 ( をスローstd::bad_alloc)、私は「安全」ですか、それともリークしintますか?

C++11 23.3.6.5 [vector.modifiers]/1 言います:

コピー コンストラクター、ムーブ コンストラクター、代入演算子、ムーブ代入演算子以外によって、Tまたは任意のInputIterator操作によって例外がスローされた場合、影響はありません。

これは、これが潜在的な問題であることを示しているようです。つまり、「影響がない」場合、unique_ptr構築されたものはありません。そのため、そのポインタに依存するデストラクタの動作deleteは発生しません。(これは、s のemplace_backコンテナーに対して禁止する必要があることを示している可能性がありますunique_ptr)

4

1 に答える 1

19

再割り当てが必要で失敗した場合、はい、オブジェクトはコンテナーに入らず、失われます。

ただし、これは純粋なユーザー エラーであることに注意してください。emplace_backのコンテナに対して「禁止」するべきではありません。unique_ptrこれを行うための完全に安全な方法があるreserveためです (事前にスペースを ing するなど、常にそこにあることがわかります)。unique_ptrまた、 move コンストラクターを完全に使用できるため、s全体を渡すこともできます。

int*つまり、例外をスローする前に、非 RAII オブジェクト ( ) を RAII オブジェクトに適切にラップしていないのは、あなたの責任です。

于 2012-11-01T07:42:27.310 に答える