как создать уникальный указатель, указывающий на определенную строку - PullRequest
0 голосов
/ 02 августа 2020

Учитывая строку s, например auto s = std::string("hello"), как бы вы написали код для создания уникального указателя, указывающего на созданную копию этой строки (не обязательно s) - Я пробовал много вариантов auto ptr = std::make_unique<std::string>(s), но ничего не кажется работать.

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Это отлично работает для меня:

    std::string s = "ABCDE";
    auto ptr = std::make_unique<std::string>(s);
    std::cout << s << std::endl;
    std::cout << *ptr << std::endl;
    s = "UVWXYZ";
    std::cout << s << std::endl;
    std::cout << *ptr << std::endl;

дает мне вывод:

ABCDE
ABCDE
UVWXYZ
ABCDE

это то, что вы пытаетесь выполнить sh?

1 голос
/ 02 августа 2020

tl; dr: Никогда не делайте этого!

Почему? Поскольку std::string владеет памятью, которую он использует в качестве буфера: строка освобождает эту память, когда она разрушается (если она не находится внутри самого строкового объекта - оптимизация для малых строк); и он может перераспределить его, чтобы отразить изменения в содержимом строки. Но - unique_ptr также владеет памятью, на которую указывает, т.е. он также отвечает за ее освобождение при разрушении.

Итак, если вы создаете уникальный указатель, указывающий на буфер строки, возможно произойдет одно из двух:

  1. Вы попытаетесь получить доступ к свободной памяти
  2. Вы попытаетесь дважды освободить один и тот же участок памяти

... так что не делай этого.

...