4

具有以下内容:

#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用弦来确定吗?

4

1 回答 1

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

于 2012-12-25T23:59:54.403 回答