为什么这样做:从std :: string函数返回C字符串文字并调用c_str()

gui*_*low 43 c++

我们最近在大学里做了一个讲座,我们的教授告诉我们在使用不同语言编程时需要注意的不同事项.以下是C++中的一个示例:

std::string myFunction()
{
    return "it's me!!";
}

int main(int argc, const char * argv[])
{
    const char* tempString = myFunction().c_str();

    char myNewString[100] = "Who is it?? - ";
    strcat(myNewString, tempString);
    printf("The string: %s", myNewString);

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

这会失败的原因是return "it's me!!"使用char []隐式调用std :: string构造函数.该字符串从函数c_str()返回,函数返回指向数据的指针std::string.

由于函数返回的字符串未在任何地方引用,因此应立即取消分配.这就是理论.

但是,让这段代码运行没有问题.很想知道你的想法.谢谢!

jua*_*nza 45

你的分析是正确的.你有什么是未定义的行为.这意味着几乎任何事情都可能发生.在您的情况下,用于字符串的内存似乎虽然取消分配,但在访问时仍保留原始内容.这通常是因为操作系统没有清除解除分配的内存.它只是标记为可供将来使用.这不是C++语言必须处理的事情:它实际上是一个OS实现细节.就C++而言,适用于所有"未定义的行为".

  • `这经常发生,因为操作系统没有清除解除分配的内存.不是这样.它不是操作系统,而是通常的malloc实现,可以是第三方,如jemalloc甚至是自定义的. (12认同)

jbg*_*bgs 5

我想释放并不意味着内存清理或归零.显然,这可能导致其他情况下的段错误.