C ++中的字符串分配:为什么这样做?

时间:2016-03-12 16:12:00

标签: 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;
}

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

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:13)

std::cout << s尝试访问指针时, 未定义的行为,因为std::string中的本地changeString的析构函数释放了指针仍然存在的内存指向。

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

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