c++中字符串常量的寿命是多长?
How long does a string constant live in c++?
我一直在想,字符串常量在c++中存在多久?例如,如果我在函数中创建一些const char *str = "something",返回str的值是否安全?
我写了一个示例程序,并且非常惊讶地看到这样的返回值仍然存储该字符串。下面是代码:
#include <iostream>
using namespace std;
const char *func1()
{
const char *c = "I am a string too";
return c;
}
void func2(const char *c = "I'm a default string")
{
cout << c << endl;
}
const int *func3()
{
const int &b = 10;
return &b;
}
int main()
{
const char *c = "I'm a string";
cout << c << endl;
cout << func1() << endl;
func2();
func2("I'm not a default string");
cout << *func3() << endl;
return 0;
}
输出如下:
I'm a string
我也是一个字符串
I是默认字符串
I不是默认字符串
10
func3的存在只是为了确定是否同样适用于其他类型。
所以问题是:它是安全的返回一个指针的字符串常量创建在该函数(如在func1())?
另外,使用func2()中的默认字符串值是否安全?
字符串具有静态存储时间,并持续程序的生命周期。来自c++标准草案2.14.5
字符串字面值段落8,其中说(强调我的前进):
也引用普通字符串字面值和UTF-8字符串字面值作为窄字符串字面值。窄字符串字面值的类型为"数组"n的const char ",其中n是字符串的长度,定义如下:和具有静态存储时间(3.7)。
和3.7.1
静态存储持续时间段1:
所有没有动态存储时间的变量都不存在线程存储持续时间,并且不具有本地静态存储持续时间。这些实体的存储将持续一段时间
另一方面,func3
中的第二种情况是无效的。临时绑定到引用的生命周期将持续到引用的生命周期,在这种情况下,当函数返回时生命周期结束。这将在12.2
节中讨论,其中说:
第二个上下文是当引用绑定到临时对象时。<一口> 115 共舞对象绑定到的临时对象或作为对象的临时对象引用绑定到的子对象的完整对象除了:一口>
之外,在引用的生命周期内持续存在
相关文章:
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 3 与错误最接近的总和:字符串常量之前的预期非限定 id
- 为什么字符串(常量字符* s,size_t pos,size_t len = npos)有效?
- 指向字符串常量的指针
- 警告:ISO C++禁止将字符串常量转换为'char*' [-Wwrite-strings]
- 为什么在波纹管程序中发生了从字符串常量到'char*'的警告已弃用的转换
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 如何从字符串常量创建字符数组
- 将字符串常量转换为char
- C++ 字符串常量和静态初始化顺序惨败
- 使用 std::string 返回开关大小写块中的字符串常量
- 消除从字符串常量到'char*'的已弃用转换的最佳方法"
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 字符常量或字符串常量
- Swig:如何类型映射c ++字符串常量和python字符串?
- 字符串常量之前的预期构造函数、析构函数或类型转换
- 为什么从字符串常量到"char*"的转换在 C 中有效,但在C++中无效
- 警告:已弃用从字符串常量到 'char* 的转换
- 无法获得通过C++警告:(和崩溃后)已弃用从字符串常量到"char*"的转换 [-Wwrite-strings]
- 错误:字符串常量 extern "a" { 之前应为非限定 ID