Вы не можете наивно хранить указатель на строковый литерал в unique_ptr
.Указатель здесь предполагает, что владеет ссылочным объектом и может его освободить.Но он не может принадлежать указателю, поскольку строковые литералы имеют статическую длительность хранения.
Если вы хотите сохранить модифицируемую c-строку в unique_ptr
, вам необходимо выделить и скопировать, вы можете 't ударить систему типов по голове с помощью приведения и продолжить свою веселую жизнь.
Так что утилита, которая превращает строковые литералы в уникальные указатели, может выглядеть так:
template<std::size_t N>
auto literal_dup(char const (&lit)[N]) {
auto ptr = std::make_unique<char[]>(N);
std::copy(lit, lit + N, &ptr[0]);
return ptr;
}
Использованиеэто будет выглядеть так:
std::unique_ptr<char[]> c_string;
c_string = literal_dup("anisha");
Нам нужно использовать массив массива unique_ptr
, чтобы убедиться, что он освобождает буфер правильно и без неопределенного поведения.