Подтвердить что ты не робот

Безопасно ли использовать emplace_back с контейнером unique_ptrs?

Рассмотрим следующее:

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

Если перераспределение происходит в векторе, и что не выполняется (выбрасывание std::bad_alloc), я "безопасен" или я пропущу int?

С++ 11 23.3.6.5 [vector.modifier]/1 говорит:

Если исключение выбрано иначе, чем конструктор копирования, переместите конструктор, оператор присваивания или оператор присваивания перемещения T или любой из операций InputIterator, никаких эффектов нет.

что, по-видимому, указывает на то, что это потенциальная проблема. То есть, если "нет эффектов", тогда не было построено unique_ptr, и поэтому поведение деструктора было бы опираться на delete, чтобы указатель не возникал. (Это может означать, что emplace_back должен быть запрещен для контейнеров unique_ptr s)

4b9b3361

Ответ 1

Если требуется перераспределение, и он терпит неудачу, тогда да, ваш объект никогда не попадал в контейнер и, таким образом, был бы потерян.

Однако следует отметить, что это чистая ошибка пользователя. emplace_back не должен быть "запрещен" для контейнеров unique_ptr, потому что есть совершенно безопасные способы сделать это (например, reserve занять место заранее, чтобы вы знали, что он всегда будет там). Кроме того, вы можете передать в целом unique_ptr s, так как он отлично умеет использовать конструктор перемещения.

Итак, это ваша ошибка в том, что вы не должным образом обертываете свой объект без RAII (int*) в объекте RAII до того момента, когда вы можете генерировать исключения.