Как присвоить значение unique_ptr после его объявления? - PullRequest
0 голосов
/ 27 ноября 2018
#include <iostream>
#include <memory> // unique_ptr

using namespace std;

int main()
{
    std::unique_ptr<char*> char_ptr;

    char_ptr = (char*)"anisha";
    return 0;
}

Я хочу присвоить некоторое значение этому unique_ptr в другом месте кода.
Это дает следующую ошибку: char_ptr = (char*)"anisha";

error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<char*>’ and ‘char*’)
     char_ptr = (char*)"anisha";

Как присвоить значение для unique_ptrпосле объявления этого?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы не можете наивно хранить указатель на строковый литерал в 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, чтобы убедиться, что он освобождает буфер правильно и без неопределенного поведения.

0 голосов
/ 27 ноября 2018

Используйте std :: make_unique.Вот отредактируйте ваш код -

#include <iostream>
#include <memory> // unique_ptr

using namespace std;

int main()
{
    std::unique_ptr<char*> char_ptr;

    //char_ptr = (char*)"anisha";
    char_ptr = std::make_unique<char*>((char*)"anisha");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...