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# string与c++ std::string的互相转换
c# string与c++ std::string的互相转换