首页  >  文章  >  后端开发  >  为什么将 stringstream.str().c_str() 分配给 const char* 会导致悬空指针,如何解决这个问题?

为什么将 stringstream.str().c_str() 分配给 const char* 会导致悬空指针,如何解决这个问题?

Linda Hamilton
Linda Hamilton原创
2024-11-22 07:17:14177浏览

Why does assigning `stringstream.str().c_str()` to a `const char*` lead to a dangling pointer, and how can this issue be resolved?

理解 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&amp; tmp = stringstream.str();   
  const char* cstr = tmp.c_str();
}

在修改后的代码示例中,两者cstr 和 cstr2 指向在 const 字符串对象的生命周期中存在的有效 C 风格字符串。因此,两个字符串都可以正确打印。

需要注意的是,通常首选将临时字符串绑定到 const 引用,因为它可以避免不必要的复制,并提供更高效、更简洁的解决方案。

以上是为什么将 stringstream.str().c_str() 分配给 const char* 会导致悬空指针,如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

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