char *范围在C ++容器中

时间:2012-12-25 23:57:43

标签: c++ containers cstring strdup

以下内容:

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

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

然而,有没有保证,例如,如果该集合是bozo对象的一部分,那么它们一直持续到bozo生命周期结束?或者我必须strdup字符串才能确定?

1 个答案:

答案 0 :(得分:8)

你完全没问题,因为字符串文字有静态存储持续时间。也就是说,字符串将在程序的持续时间内存储在内存中。但是,如果您将cd声明为数组,那就不行了。

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