C++ C+中的字符串分配+;:为什么这样做有效? void changeString(常量字符*&s){ std::字符串str(s); str.replace(0,5,“Howdy”); s=str.c_str(); } int main(){ const char*s=“你好,世界!”; 更改字符串; std::cout

C++ C+中的字符串分配+;:为什么这样做有效? void changeString(常量字符*&s){ std::字符串str(s); str.replace(0,5,“Howdy”); s=str.c_str(); } int main(){ const char*s=“你好,世界!”; 更改字符串; std::cout,c++,string,stdstring,C++,String,Stdstring,是的,str被销毁;但是字符串的内存没有被清除;您的“s”指针指向一个可用但未清除的内存。非常危险。这是未定义的行为当std::我猜这是否发生在工作中。有时未定义的行为似乎起作用。但是,你不应该期望它起作用。运气不好。你是对的,它错了。你不会做任何会重新分配和删除的事情r在使用删除的块之前将其写入,并且实现很少通过将删除的块返回到系统来使其无效,因此您的示例很可能正常工作,但它仍然是未定义的行为。您应该返回字符串。我想告诉您使用适当的工具,但没有任何工具、gdb或catch a亲爱的,多伤心啊。

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

这是未定义的行为
std::我猜这是否发生在工作中。有时未定义的行为似乎起作用。但是,你不应该期望它起作用。运气不好。你是对的,它错了。你不会做任何会重新分配和删除的事情r在使用删除的块之前将其写入,并且实现很少通过将删除的块返回到系统来使其无效,因此您的示例很可能正常工作,但它仍然是未定义的行为。您应该
返回
字符串。我想告诉您使用适当的工具,但没有任何工具、gdb或catch a亲爱的,多伤心啊。
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;
}