理解 Stringstream、String 和 char* 转换
编程中一个常见的困惑涉及 stringstream、string 和 char 之间的相互作用 转换。本文旨在阐明从 stringstream.str().c_str() 返回的字符串驻留在内存中的位置以及为什么它不能直接分配给 const char.
当使用 stringstream 时, str( ) 函数返回一个临时字符串对象,该对象仅存在于调用它的表达式中。该字符串对象通常在堆栈上创建,并在表达式结束后被销毁。
让我们检查提供的代码示例:
#include <string> #include <sstream> #include <iostream> using namespace std; int main() { stringstream ss("this is a string\n"); string str(ss.str()); const char* cstr1 = str.c_str(); const char* cstr2 = ss.str().c_str(); cout << cstr1 // Prints correctly << cstr2; // ERROR, prints out garbage system("PAUSE"); return 0; }
当我们尝试分配结果时,就会出现问题stringstream.str().c_str() 到 const char* cstr2。由于返回的字符串是临时的,因此在表达式结束后它会被销毁,从而使 cstr2 指向悬空指针。因此,打印 cstr2 会导致垃圾。
解决问题:
为了避免这个问题,我们可以将临时字符串复制到永久字符串对象并获取其C 风格字符串或将临时字符串绑定到 const 引用,延长其生命周期:
// Copy to a permanent string const std::string tmp = stringstream.str(); const char* cstr = tmp.c_str(); // Bind to a const reference { const std::string& tmp = stringstream.str(); const char* cstr = tmp.c_str(); }
在修改后的代码示例中,两者cstr 和 cstr2 指向在 const 字符串对象的生命周期中存在的有效 C 风格字符串。因此,两个字符串都可以正确打印。
需要注意的是,通常首选将临时字符串绑定到 const 引用,因为它可以避免不必要的复制,并提供更高效、更简洁的解决方案。
以上是为什么将 stringstream.str().c_str() 分配给 const char* 会导致悬空指针,如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!