以下内容:
#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("%s\n", *iter);
}
return 0;
}
最后,正如预期的那样,我收到a
和b
已打印。
然而,有没有保证,例如,如果该集合是bozo
对象的一部分,那么它们一直持续到bozo
生命周期结束?或者我必须strdup
字符串才能确定?
答案 0 :(得分:8)
你完全没问题,因为字符串文字有静态存储持续时间。也就是说,字符串将在程序的持续时间内存储在内存中。但是,如果您将c
和d
声明为数组,那就不行了。
const char c[] = "a";
const char d[] = "b";
这是因为当使用字符串文字初始化数组时,文字中的字符将被复制到数组中。该数组具有自动存储持续时间,因此内容将在函数x
结束时销毁。如果您仍然执行global.insert(c)
,那么您将推送指向c
数组的第一个元素的指针,但该数组将不会存在更长时间。
这是一些标准报价。首先,§2.14.5/ 8:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“ n
const char
”数组,其中 n 是下面定义的字符串大小,并且具有静态存储持续时间(3.7 )。
现在定义静态存储持续时间(§3.7.1/ 1):
所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续到程序的持续时间(3.6.2,3.6.3)。