【发布时间】:2016-06-27 20:53:05
【问题描述】:
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 的方式上遗漏了什么吗?
【问题讨论】:
-
我猜这碰巧起作用了。
-
有时未定义的行为似乎有效。但是,您不应该期望这会起作用。
-
运气不好。你是对的,它是错误的。
-
在使用该块之前,您不会执行任何会重新分配和覆盖已删除块的操作,并且实现很少通过将已删除块返回到系统来使已删除块无效,因此您的示例很可能碰巧工作,但它仍然是未定义的行为。你应该
return这个字符串。