首页 > 后端开发 > C++ > 正文

为什么 `stringstream.str().c_str()` 会导致 C 内存错误?

Mary-Kate Olsen
发布: 2024-11-15 05:01:02
原创
959 人浏览过

Why Does `stringstream.str().c_str()` Cause a Memory Error in C  ?

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 (???)
登录后复制

所有打印语句现在都可以正常工作,因为:

  • cstr 和cstr2どちらも有效な文字列ポインタです。
  • ss.str().c_str() 是一个临时字符串,绑定到 const 引用,延长其生命周期。

以上是为什么 `stringstream.str().c_str()` 会导致 C 内存错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板