【问题标题】:Can I safely get a c_str out of std::stringstream in c++?我可以安全地从 c++ 中的 std::stringstream 中获取 c_str 吗?
【发布时间】:2021-04-10 11:01:47
【问题描述】:

我正在使用一个 C 函数,它接受一个字符串(即指向一个以空字符结尾的 char 数组的指针)并在内部处理它。但是,它在函数返回后保留对字符串的引用。

我想向它传递一些格式化的输入,所以我使用std::stringstream。为了让我的代码更简洁——并且因为这种模式在整个代码库中重复出现,我想简单地传递ss.str().c_str()

对我来说,这似乎很可怕,因为我在临时 ss.str() 上调用了一个方法,但我认为这可以延长寿命。即,标准说:

在函数调用 (5.2.2) 中临时绑定到引用参数会一直存在,直到包含调用的完整表达式完成为止 [...] 在所有这些情况下,在初始化表达式的评估期间创建的临时对象除了引用绑定到的临时引用之外,该引用在在创建它们的完整表达式的末尾被销毁,并以它们构造完成的相反顺序被销毁。

(强调我的)

因此,我希望我的价值观在 C API 调用结束之前一直存在。我弄错了吗?这样做安全吗?从概念上讲,我的代码如下所示:

void g(int x, int y) {
    std::stringstream ss;
    ss << "(" << x << ", " << y << ")";
    puts(ss.str().c_str());
}

【问题讨论】:

  • “完整表达式的结尾”是; 后面的puts 这里。

标签: c++ reference pass-by-reference lifetime


【解决方案1】:

是的,这很好,ss.str().c_str() 在使用 C 风格的 API 时经常出现。

通俗地说,从ss.str() 返回的匿名临时std::stringputs() 函数调用中仍然存在。这意味着c_str() 返回的const char* 指针在puts() 的持续时间内仍然有效。

不能做的是:

const char* ub = ss.str().c_str();
puts(ub);

因为指针ub 悬空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-11
    • 2023-03-23
    • 1970-01-01
    • 2019-08-13
    • 2020-10-01
    • 2020-02-25
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多