【问题标题】:C++ lifetime of a dangling string悬空字符串的 C++ 生命周期
【发布时间】:2019-06-03 06:50:36
【问题描述】:

在C,你可以写

const char *result = "AB";

C++ 标准支持这种风格吗?这个常量字符串的生命周期是否与指针的范围相同?

【问题讨论】:

  • 字符串常量将成为代码段的一部分,只是当指针的范围结束时,您只是失去了对常量字符串的引用。
  • @kiranBiradar 这不一定是代码段。有些平台确实有三个部分:代码(可读和可执行)、只读数据(只是可读)和标准数据(可读和可写)。但是你的主要观点是文字本身永远不会“超出范围”是有效的。
  • @MichaelKarcher 我同意,我说得更笼统。

标签: c++ pointers standards lifetime


【解决方案1】:

文字字符串常量具有整个程序的生命周期,并且存储字符串的数组永远不会超出范围。

请注意,C 和 C++ 中的文字字符串之间存在语义差异:在 C++ 中,文字字符串存储在 constant 字符数组中(因此需要 const char* 中的 const)。在 C 中,它们不是常量数组(所以 char * 在 C 中没问题)。但是,不允许在 C 中修改文字字符串,这使得它们只读(但不是常量)。

【讨论】:

    【解决方案2】:

    引用C++17,第 5.13.5 章(强调我的)

    普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。一个箭头 字符串字面量的类型为“array of n const char”,其中 n 是字符串的大小,如下定义, 并且具有 静态存储时长

    以及,对于静态存储持续时间,第 § 6.7.1 章

    所有没有动态存储时长、没有线程存储时长的变量 非本地具有静态存储持续时间。 这些实体的存储将持续到 程序。

    所以,字符串字面量的生命周期是程序的整个执行过程,它永远不会超出范围。

    【讨论】:

      【解决方案3】:

      这个常量字符串的生命周期是否保证与指针的范围相同?

      不,字符串字面量的生命周期与指向它们的指针的生命周期无关; String literals 存在于程序的整个生命周期中。

      字符串文字有static storage duration,因此在程序的生命周期内都存在于内存中。

      [lex.string]

      6 在翻译阶段 6 之后,string-literal 不以 编码前缀是普通的字符串文字。一个普通的字符串 文字的类型为“n const char 数组”,其中 n 是 如下定义的字符串,具有静态存储持续时间 ([basic.stc]), 并使用给定的字符进行初始化。

      15 评估 string-literal 会产生一个字符串字面量对象 静态存储持续时间,从给定字符初始化为 上面指定。 ...

      【讨论】:

        【解决方案4】:

        字符串常量(字面量)与整个程序具有相同的生命周期。从创建指针之前到销毁之后很长时间

        【讨论】:

          猜你喜欢
          • 2012-04-15
          • 2015-01-22
          • 1970-01-01
          • 2020-04-20
          • 1970-01-01
          • 1970-01-01
          • 2011-02-04
          • 2015-09-22
          • 1970-01-01
          相关资源
          最近更新 更多