【问题标题】:Does using `std::string::c_str` return a dynamically allocated array? [duplicate]使用 `std::string::c_str` 会返回动态分配的数组吗? [复制]
【发布时间】:2013-04-14 17:23:06
【问题描述】:

std::string::c_str 上的文档说:

“返回一个指向数组的指针,该数组包含一个以 null 结尾的字符序列(即 C 字符串),表示字符串对象的当前值。”

这个数组是在调用 c_str 时动态分配的吗?如果不是,它是从哪里来的?

【问题讨论】:

    标签: c++ string dynamic-allocation


    【解决方案1】:

    对于 C++2003,这取决于标准库的实现。它的实际存储很可能由std::string 的实例管理。有些实现可能使用内部缓冲区,有些可能使用单独的预分配缓冲区。不过,它是一个常量时间访问器,因此可用于库实现的选项是有限的。

    您不应该在标准允许的范围之外乱用内存,因为标准库的不同实现可能会让您一头雾水。

    有趣的是,对于 C++11,这有点定义,它必须指向内部缓冲区并且是 std::string::data 的同义词。

    【讨论】:

    • 我认为分配一个新的缓冲区是不可能的,因为将字符串复制到新的缓冲区不是恒定的时间,而是字符串长度的 O(n)。在实践中,我认为除了 C++11 编码的“返回一个指向内部缓冲区的 const 指针”之外,我没有听说过任何其他行为。
    • 不,我也看不出你可以分配的方式。一个实现可能可能有两个并行更新的缓冲区,但很难想出为什么的原因。答案已编辑。
    • 如果您有一个符合c_str 要求的缓冲区,则没有实际理由以不同的格式保留第二个缓冲区。并且绝对没有理由证明将内存开销加倍(并且可能将所有其他操作的性能减半)。
    • 所有有效积分。我可以想到的唯一原因是,如果您确保没有通过c_str 返回的指针对内部缓冲区进行更改。我假设这样的事情只会发生在标准库的调试版本中。 c_str 最有可能将指针返回到内部缓冲区,关键是它在C++11 之前没有
    【解决方案2】:

    在 C++11 之前它是未指定的。 string 对象管理它。在 C++11 中,它指向 string 对象数据。

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 2013-10-19
      • 2013-10-15
      • 2018-11-22
      • 2017-03-26
      • 2021-04-02
      • 1970-01-01
      • 2020-09-21
      • 2021-12-12
      相关资源
      最近更新 更多