C++ 中的字符串分配:为什么这样做有效?

string allocation in C++: why does this work?

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;
}

当我 运行 这段代码时,它打印 "Howdy, world!" 我认为 strchangeString 退出时被破坏。 std::string 的分配方式是否遗漏了什么?

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

未定义的行为std::cout << s 尝试访问指针时,因为 changeString 中局部 std::string 的析构函数释放了指针仍然指向的内存。

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

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