【问题标题】:Does c_str Always Return the Same Address?c_str 是否总是返回相同的地址?
【发布时间】:2016-08-18 16:35:34
【问题描述】:

我知道 C++11 对string 做了很多更改。其中最重要的是要求它在内存中线性布局。

在 C++11 之前,对 string::c_str 的调用将返回 const char*,但它保证是相同的。例如,给定string foo,这是否保证为真,或者它们可能返回不同的地址?

foo.c_str() == foo.c_str()

编辑:我应该附加一下,只要foo 上没有调用任何会使其迭代器无效的方法,我应该询问string::c_str 的返回是否总是一致的。

【问题讨论】:

  • 也可能是跨站点重复:programmers.stackexchange.com/a/125149/17853(不过我相信 SO 上也有很多)
  • “在 C++11 之前,对 string::c_str 的调用会返回一个 const char* 但它保证是同一个” 这是错误的说法。 c_str 的结果可能在任何非常量函数之后发生变化。例如,尝试将一个长(比如 2048 chars)字符串附加到您最初的短字符串
  • @mvidelgauz 我认为他的意思是“同一个”,没有迭代器失效(即:通过调用非常量成员函数)
  • 你为什么想要或需要依赖它是一样的?
  • @KABoissonneault 那么答案应该是肯定的——只要没有在对象内部缓冲区上调用非常量函数就不会重新定位,并且在 C++11 之前也得到保证——@ 的结果987654331@ 在第一次(可能的)突变之前有效

标签: c++ string c-strings c++03


【解决方案1】:

编辑:从标准中读取相同的段落,我现在得出结论,允许对方法 data()/c_str() 的后续调用使先前返回的指针无效(即使您没有做了任何其他事情),所以你的问题的答案将是,多么讽刺。

原答案:

是的,只要您对对象执行的唯一非常量操作是 operator[]atbegin、rbegin、endrend

data()/c_str() 返回指向字符串第一个元素的指针。参见标准 (N1905),第 10 页。 21.3【类模板basic_string】:

  1. 引用 basic_string 序列元素的引用、指针和迭代器可能会被 该 basic_string 对象的以下用途:

— 作为非成员函数 swap() (21.3.7.8)、operator>>() (21.3.7.9) 和 getline() (21.3.7.9) 的参数。

——作为 basic_string::swap() 的参数。

——调用 data() 和 c_str() 成员函数。

——调用非常量成员函数,除了operator[]、at、begin、rbegin、end和rend

- 遵循构造或上述任何用途,除了返回迭代器的插入和擦除形式,第一次调用非常量成员函数 operator[]、at、begin、rbegin、end 或 rend。

【讨论】:

  • 您在第一句话中删除了“非常量”。
  • 哇,所以对 string::c_str 的 2 次后续调用可能会使对 basic_string 序列的元素的引用无效。我预计会有更多的箍必须跳过来证明这一点,而不是那么直接。感谢您从标准中找到如此相关的报价!我会在答案在阳光下度过一个周末后接受。
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 2012-05-27
  • 2022-10-27
  • 2020-09-20
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多