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;
}
当我运行此代码时,它会打印出“你好,世界!”当str
退出时,我认为changeString
会被销毁。我错过了std::string
被分配的方式吗?
答案 0 :(得分:13)
是的,str被摧毁;但是字符串的内存没有被清除;你的“s”指针指向一个空闲但未清除的内存。非常危险。
答案 1 :(得分:13)
std::cout << s
尝试访问指针时, 未定义的行为,因为std::string
中的本地changeString
的析构函数释放了指针仍然存在的内存指向。
您的编译器不需要诊断错误,但可以生成二进制文件,然后可以执行任何操作。
您获得所需输出的事实只是运气不好,因为它让您认为您的代码是正确的。例如,我刚刚在我的机器上编译了你的代码并获得了空输出。它也可能已经崩溃,或者它可能已经做了其他无关的事情。