如何构造一个指向某个字符串的唯一指针
how to construct a unique pointer that points to a certain string
给定一个字符串 s 例如auto s = std::string("hello")
,您将如何编写代码来制作指向此字符串的已创建副本(不一定是 s)的唯一指针 - 我已经尝试了 auto ptr = std::make_unique<std::string>(s)
的多种变体,但似乎没有任何效果。
tl;dr:永远不要那样做!
为什么?因为 std::string
拥有 它用作缓冲区的内存:字符串在被破坏时释放此内存(如果它不在字符串对象本身内 - 小字符串优化) ;它可能会重新分配它以反映字符串内容的变化。但是 - unique_ptr 也 拥有它指向的内存,即它还负责在销毁时释放它。
因此,如果您创建一个指向字符串缓冲区的唯一指针,可能会发生以下两种情况之一:
- 您将尝试访问空闲的内存
- 您将尝试两次释放同一段内存
... 所以,真的,不要那样做。
这对我来说很好用:
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
这就是您要实现的目标吗?
给定一个字符串 s 例如auto s = std::string("hello")
,您将如何编写代码来制作指向此字符串的已创建副本(不一定是 s)的唯一指针 - 我已经尝试了 auto ptr = std::make_unique<std::string>(s)
的多种变体,但似乎没有任何效果。
tl;dr:永远不要那样做!
为什么?因为 std::string
拥有 它用作缓冲区的内存:字符串在被破坏时释放此内存(如果它不在字符串对象本身内 - 小字符串优化) ;它可能会重新分配它以反映字符串内容的变化。但是 - unique_ptr 也 拥有它指向的内存,即它还负责在销毁时释放它。
因此,如果您创建一个指向字符串缓冲区的唯一指针,可能会发生以下两种情况之一:
- 您将尝试访问空闲的内存
- 您将尝试两次释放同一段内存
... 所以,真的,不要那样做。
这对我来说很好用:
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
这就是您要实现的目标吗?