stringstream、string 和 char 之间的转换混淆*
转换从 stringstream.str() 获取的字符串时会出现此问题。 c_str() 转换为 const char*。了解返回字符串的内存管理和生命周期对于避免潜在错误至关重要。
代码片段演示了该问题:
#include <string> #include <sstream> #include <iostream> 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 打印出垃圾的错误。
了解内存管理
stringstream.str() 返回一个临时字符串对象,该对象仅在结束之前有效当前表达式的。当表达式完成时,临时对象被销毁,指向其数据的指针(由 c_str() 返回)变得无效。
解决错误
解决这个问题,临时字符串对象必须存储在单独的变量中,如:
const std::string tmp = stringstream.str(); const char* cstr2 = tmp.c_str();
通过将临时对象存储在tmp,指针的生命周期延长,并且打印 cstr2 现在可以正常工作。
奖励积分说明
修改后的代码块中:
cout << cstr // Prints correctly << ss.str().c_str() // Prints correctly << cstr2; // Prints correctly (???)
所有打印语句现在都可以正常工作,因为:
以上是为什么 `stringstream.str().c_str()` 会导致 C 内存错误?的详细内容。更多信息请关注PHP中文网其他相关文章!