c++容器中的char*作用域

char* scope inside C++ containers

本文关键字:char 作用域 c++      更新时间:2023-10-16

与以下内容:

#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;
}

最后,如预期的那样,我收到了ab的打印。

然而,是否有任何保证,例如,如果该集合是bozo对象的一部分,那么作为该集合,它们将持续到bozo的生命周期结束?或者我需要strdup字符串来确定?

完全没问题,因为字符串文字具有静态存储持续时间。也就是说,在程序运行期间,字符串将在内存中存在。但是,如果您像这样将cd声明为数组,则不可以:

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)。