C++:指向 std::string 转换的 char 指针是不是复制内容?

Posted

技术标签:

【中文标题】C++:指向 std::string 转换的 char 指针是不是复制内容?【英文标题】:C++ : Does char pointer to std::string conversion copy the content?C++:指向 std::string 转换的 char 指针是否复制内容? 【发布时间】:2013-05-08 11:26:49 【问题描述】:

当我使用构造函数将char* 转换为std::string 时:

char *ps = "Hello";
std::string str(ps);

我知道 std 容器在被要求存储值时倾向于复制值。 是复制整个字符串还是仅复制指针? 如果之后我做str = "Bye" 会改变 ps 指向“Bye”吗?

【问题讨论】:

他们有重载的赋值运算符,实际上如果我猜对了他们会使用复制和交换算法。并且将从 char* 创建一个临时字符串对象。 @Koushik:你猜错了。在这里制作浅拷贝会违反直觉并且容易出错。 @VioletGiraffe 是的,我意识到指针没有被复制,并且有一个深拷贝,应该有一个内部缓冲区来保存它。 不要将字符串文字分配给char*,始终使用const char*。字符串文字不应该改变。 char *ps = "Hello"; 应该是const char *ps = "Hello"; 【参考方案1】:

std::string 对象将分配内部缓冲区并将ps 指向的字符串复制到那里。对该字符串的更改不会反映到ps 缓冲区,反之亦然。它被称为“深拷贝”。如果只复制指针本身而不复制内存内容,则称为“浅拷贝”。

重申一下:std::string 在这种情况下执行深层复制。

【讨论】:

你能添加一个来源吗? @PhilippLudwig 标准(N4140,§21.4-2)说 basic_string 的成员函数使用作为模板参数传递的 Allocator 类的对象来分配和释放存储对于包含的类似字符的对象。【参考方案2】:

str 将包含ps 的副本,更改str 不会更改ps

【讨论】:

以上是关于C++:指向 std::string 转换的 char 指针是不是复制内容?的主要内容,如果未能解决你的问题,请参考以下文章

C++ .NET 将 System::String 转换为 std::string

在 C++ 中将浮点数转换为 std::string

c# string与c++ std::string的互相转换

c# string与c++ std::string的互相转换

将 System::String^ (C# 字符串)转换为 C++ std::string [重复]

在 C++ 中将 std::string 转换为 Unicode 字符串