c++容器中的char*作用域
char* scope inside C++ containers
与以下内容:
#include <set>
std::set<const char *> global = std::set<const char *>();
void x() {
const char *c = "a";
const char *d = "b";
global.insert(c);
global.insert(d);
}
int main() {
x();
for (std::set<const char *>::const_iterator iter=global.begin(), end=global.end(); iter!=end; ++iter) {
printf("%sn", *iter);
}
return 0;
}
最后,如预期的那样,我收到了a
和b
的打印。
然而,是否有任何保证,例如,如果该集合是bozo
对象的一部分,那么作为该集合,它们将持续到bozo
的生命周期结束?或者我需要strdup
字符串来确定?
完全没问题,因为字符串文字具有静态存储持续时间。也就是说,在程序运行期间,字符串将在内存中存在。但是,如果您像这样将c
和d
声明为数组,则不可以:
const char c[] = "a";
const char d[] = "b";
这是因为当用字符串字面值初始化数组时,字面值中的字符会被复制到数组中。该数组具有自动存储持续时间,因此其内容将在函数x
结束时销毁。如果您仍然使用global.insert(c)
,则可以将指向c
数组第一个元素的指针压入,但是该数组将不会存在太久。
这里有一些标准的引号。首先,§2.14.5/8:
普通字符串字面值和UTF-8字符串字面值也被称为窄字符串字面值。窄字符串字面值的类型为" array of n
const char
",其中n是下面定义的字符串的大小,并具有静态存储时间(3.7)。
静态存储时间的定义(§3.7.1/1):
所有没有动态存储持续时间,没有线程存储持续时间,并且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续整个项目(3.6.2,3.6.3)。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 当字符串超出作用域时,将string::c_str()赋值给const char*
- c++容器中的char*作用域