首页  >  文章  >  后端开发  >  为什么将 stringstream.str().c_str() 分配给 const char* 会导致垃圾输出?

为什么将 stringstream.str().c_str() 分配给 const char* 会导致垃圾输出?

Barbara Streisand
Barbara Streisand原创
2024-11-16 17:16:03467浏览

Why Does Assigning `stringstream.str().c_str()` to a `const char*` Lead to Garbage Output?

stringstream、string 和 char* 转换混乱

本文解决了将 const char* 分配给 stringstream 返回的字符串的问题.str().c_str().

问题说明

stringstream.str() 构造一个临时字符串对象,该对象在表达式末尾被销毁。当将此临时字符串分配给 const char* 时,指针引用了已删除的字符串,从而导致垃圾输出。

下面是一个示例:

stringstream ss("this is a string\n");
const char* cstr = ss.str().c_str();

在上面的代码中,表达式之后结束后,由 stringstream.str() 创建的临时字符串被删除,导致 cstr 指向无效的内存位置。

解决方案

要纠正此问题,在将临时字符串转换为 const char* 之前,应将其复制到另一个字符串对象。这可以使用以下方法来实现:

string tmp = stringstream.str();
const char* cstr = tmp.c_str();

奖励积分说明

以下修改后的代码可以正确打印字符串:

cout << cstr << ss.str().c_str() << cstr2;

此修改之所以有效,是因为:

  • cstr 指向从具有已知生命周期的字符串对象创建的 const char*。
  • ss.str().c_str() 返回指向临时字符串的 const char*,该字符串现在受到 stringstream.str()
  • cstr2 指向与 ss.str().c_str() 相同的临时字符串返回的 const 引用的保护,但它不是 const,因此可以将其分配给一个临时 char*,该临时 char* 在 cout 语句末尾被销毁。

以上是为什么将 stringstream.str().c_str() 分配给 const char* 会导致垃圾输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn