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

use*_*915 9 c++ string stdstring

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;
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,它会打印出"你好,世界!" 我认为退出str时会被摧毁changeString.我错过了std::string分配方式的东西吗?

max*_*x66 13

是的,str被摧毁了; 但是字符串的内存没有被清除; 你的"s"指针指向一个空闲但未清除的内存.非常危险.


Chr*_*ckl 13

这是不确定的行为,当std::cout << s试图访问该指针,因为当地的析构函数std::string中changeString释放了该指针仍然指向的内存.

您的编译器不需要诊断错误,但可以生成二进制文件,然后可以执行任何操作.

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