Если вы находитесь в положении, где vector<int>
- это даже возможность, вы, вероятно, захотите пойти с этим, кроме крайних и редких обстоятельств.И даже в этом случае наилучшим ответом может быть нестандартный тип вместо unique_ptr<int[]>
.
Так что же это за unique_ptr<int[]>
? :-)
unique_ptr<T[]>
действительно сияет в двух случаях:
1.
Вы должны обрабатывать таНос/свободный ресурс из некоторой унаследованной функции, и вы хотели бы сделать это в современном исключения безопасного стиля:
void
foo()
{
std::unique_ptr<char[], void(*)(void*)> p(strdup("some text"), std::free);
for (unsigned i = 0; p[i]; ++i)
std::cout << p[i];
std::cout << '\n';
}
2.
вы нужно временно закрепить новый [] ресурс перед передачей его на другой владелец:
class X
{
int* data_;
std::string name_;
static void validate(const std::string& nm);
public:
~X() {delete [] data_;}
X(int* data, const std::string& name_of_data)
: data_(nullptr),
name_()
{
std::unique_ptr<int[]> hold(data); // noexcept
name_ = name_of_data; // might throw
validate(name_); // might throw
data_ = hold.release(); // noexcept
}
};
В приведенном выше сценарии X
владеет переданным ему указателем, успешно ли конструктор или нет. В этом конкретном примере используется конструктор по умолчанию noexcept
для std::string
, который не является обязательным. Однако:
- Эта точка обобщается по обстоятельствам, не связанным с
std::string
.
- A
std::string
Конструктор по умолчанию, который выбрасывает, является хромым.
Почему бы не использовать std :: array? – Bart
@Bart Ему не нужно увеличивать объем хранилища, если он был выделен, это не значит, что он знает размер во время компиляции. – Praetorian
@Bart Я обновил вопрос, чтобы предположить, что размер буфера неизвестен во время компиляции. – huitlarc