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!" 我认为 str
在 changeString
退出时被破坏。 std::string
的分配方式是否遗漏了什么?
是的,str被销毁了;但是字符串的内存没有被清除;您的 "s" 指针指向空闲但未清除的内存。非常危险。
未定义的行为 当 std::cout << s
尝试访问指针时,因为 changeString
中局部 std::string
的析构函数释放了指针仍然指向的内存。
您的编译器不需要诊断错误,而是可以生成一个二进制文件,然后它可以做任何它想做的事。
您获得所需输出的事实只是运气不好,因为它让您认为您的代码是正确的。例如,我刚刚在我的机器上编译了你的代码,却得到了空输出。它也可能崩溃了,或者它可能做了其他不相关的事情。
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!" 我认为 str
在 changeString
退出时被破坏。 std::string
的分配方式是否遗漏了什么?
是的,str被销毁了;但是字符串的内存没有被清除;您的 "s" 指针指向空闲但未清除的内存。非常危险。
未定义的行为 当 std::cout << s
尝试访问指针时,因为 changeString
中局部 std::string
的析构函数释放了指针仍然指向的内存。
您的编译器不需要诊断错误,而是可以生成一个二进制文件,然后它可以做任何它想做的事。
您获得所需输出的事实只是运气不好,因为它让您认为您的代码是正确的。例如,我刚刚在我的机器上编译了你的代码,却得到了空输出。它也可能崩溃了,或者它可能做了其他不相关的事情。