任何人都可以向我解释为什么这段代码无法将c1指向的内存分配给55,而对于c2却是如此?分配给c1的代码看起来与c2做的工作相同,但步骤较少。
#include <sstream>
#include <string>
int main ()
{
std::stringstream ss;
ss << 55;
const char* c1 = ss.str().c_str(); // *c1 = \0
// looks to be doing the same, but in stages
std::string s = ss.str();
const char* c2 = s.c_str(); // *c2 = "55"
}
答案 0 :(得分:2)
str()
是临时的,因此在语句结束时会被破坏。那时c1
将是一个悬空指针。与std::string
初始化之间的区别在于std::string
的构造函数将复制字符,直到'\0'
进入其缓冲区。
答案 1 :(得分:0)
在第一个版本中: const char * c1 = ss.str()。c_str(); 指定c1指向流ss内的内部缓冲区。
第二个版本: std :: string s = ss.str(); 将整个缓冲区复制到字符串s中。 然后 const char * c2 = s.c_str(); 指定c2指向字符串s中的内部缓冲区。
此时,这两个指针将指向包含相同字符的不同缓冲区。 如果向流ss写入了其他内容,则可以重新分配其缓冲区。 在这种情况下,c1将指向无效内存,而c2仍将指向字符串s中的有效缓冲区。