stringstream::str 复制生命周期

scr*_*cry 3 c++ memory stringstream

很多 C++ 程序员在第一次使用stringstreams 时会错过(读:我)这样一个事实,即返回的副本stringstream::str()是临时的,它会持续到它所使用的表达式结束为止。但是,我不明白:

  1. 这是如何完成的。查看sstreamlibstdc++ 的标头,我只看到正在制作并返回一个副本。寿命是如何限制的?
  2. 为什么这是理想的行为,特别是因为这是一个如此常见的问题。如果无论如何都会制作副本,为什么我不能拥有它的所有权?

请注意,这不是stringstream、string 和 char* 转换混淆的重复。这超出了对行为和解决方法的解释;我正在寻找机制和原理。

Ale*_*hev 5

这不是 的问题stringstream。这是函数的问题c_str- 它返回指向 的char*表示形式的指针std::string,但它仅在原始字符串的生命周期内存在。当您调用时,char *str = ss.str().c_str()实际上会发生以下情况:

string tmp = ss.str();
char *str = tmp.c_str();
tmp.~string (); // after that line the pointer `str` is no longer valid
Run Code Online (Sandbox Code Playgroud)

c_str是一个危险的函数,仅出于兼容性和速度目的而提供,您应该避免使用它。