c_str的奇怪行为?

Onk*_*jan 3 c++

我有一个下面的代码片段.我期待输出将是mystring,但奇怪的是它输出垃圾字符.

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
    string s1("mystring");

    const char* s2 = s1.c_str();

    s1 = "Hi there, this is a changed string s1";

    cout << s2 << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(1)我最初的想法是,c_str负责分配足够的存储空间来保存的s1,并返回其被分配到该内存块的地址s2,并从这里开始s1,并s2开始了独立.

(2)但当我s1 = "Hi there ..... "在(1)中指出我的想法被证明是错误的.不知何故,s1仍在影响着s2.

(3)当我注释掉s1 = "Hi there .... "线条时,一切正常,即mystring一致打印.

(4)我并不是真的相信我在(1)中的主张c_str是分配内存来保持s1,因为如果是这种情况,我们将不得不通过s2我们不做的指针来释放那个内存块.所以我不确定.

请帮我解释这个奇怪的行为.

use*_*894 11

引用cppreference:

获得的指针c_str()可以通过以下方式无效:

  • 在字符串上调用非const成员函数,不包括operator [],at(),front(),back(),begin(),rbegin(),end()和rend().

通过修改字符串,您不再具有有效指针.

而且,你的前提是错误的.没有内存分配/免费wrt c_str.c_strdata(在C++ 11中相同)返回指向底层存储的指针.它不拥有存储空间.当存储因任何原因发生变化时,您的指针不再有效(即,它现在可能指向垃圾).


joh*_*ohn 6

s1.c_str()不返回独立的内存s1.更改以s1 使返回的指针无效s1.c_str().

换句话说要小心使用c_str.通常使用它将C字符串传递给不接受C++字符串的函数.