【问题标题】: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";

标签: c++ string constructor stdstring


【解决方案1】:

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 2011-04-24
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2018-06-08
    相关资源
    最近更新 更多