【问题标题】:string allocation in C++: why does this work? [duplicate]C++ 中的字符串分配:为什么会这样? [复制]
【发布时间】:2016-06-27 20:53:05
【问题描述】:
void changeString(const char* &s){
    std::string str(s);
    str.replace(0, 5, "Howdy");
    s = str.c_str();
}

int main() {
    const char *s = "Hello, world!";
    changeString(s);
    std::cout << s << "\n";
    return 0;
}

当我运行这段代码时,它会打印“你好,世界!”我认为strchangeString 退出时会被破坏。我在分配std::string 的方式上遗漏了什么吗?

【问题讨论】:

  • 碰巧起作用了。
  • 有时未定义的行为似乎有效。但是,您不应该期望这会起作用。
  • 运气不好。你是对的,它是错误的。
  • 在使用该块之前,您不会执行任何会重新分配和覆盖已删除块的操作,并且实现很少通过将已删除块返回到系统来使已删除块无效,因此您的示例很可能碰巧工作,但它仍然是未定义的行为。你应该return这个字符串。
  • 我想告诉你使用适当的工具,但ASanUBSan、gdb 或 cppcheck 都没有捕捉到任何东西。多么悲伤。

标签: c++ string stdstring


【解决方案1】:

是的,str被销毁了;但是字符串的内存没有被清除;您的“s”指针指向一个空闲但未清除的内存。非常危险。

【讨论】:

    【解决方案2】:

    std::cout &lt;&lt; s 尝试访问指针时是未定义的行为,因为 changeString 中本地 std::string 的析构函数已释放指针仍指向的内存。

    您的编译器不需要诊断错误,而是可以生成一个二进制文件,然后它可以做任何它想做的事情。

    您获得所需输出的事实只是运气不佳,因为它让您认为您的代码是正确的。例如,我刚刚在我的机器上编译了你的代码并得到了空输出。它也可能崩溃了,或者它可能做了其他不相关的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2019-05-20
      • 2016-06-13
      相关资源
      最近更新 更多