为什么 std::vector 0 会初始化它的内存?

gan*_*an_ 2 c++ memory vector std c++11

我最近注意到std::vector分配后确实会用零清除内存。

我之前创建过类似的容器(尽管不合std规),并且在创建新项目之前我从来不需要显式地将内存清零。

我看不出这样做的理由,我只是想知道为什么。

为了显示 :

struct S {
    int s[128];
};

bool vector_zeroed() {
    std::vector<S> c;
    while(c.size() < 1000) {
        c.emplace_back();
    }

    bool zeroed = true;
    for(const auto& s : c) {
        for(int i : s.s) {
            zeroed &= i == 0;
         }
    }
    return zeroed;
}

bool array_zeroed() {
    bool zeroed = true;
    auto *s = new S[1000];
    for(int k = 0; k != 1000; ++k) {
        for(int i : s[k].s) {
            zeroed &= i == 0;
        }
    }
    delete[] s;
    return zeroed;
}
Run Code Online (Sandbox Code Playgroud)

vector_zeroed()似乎总是在返回true时返回。array_zeroed()false

我显然在这里遗漏了一些东西,但我不知道是什么。

Sme*_*eey 5

当创建一个std::vector包含 n 个元素的元素时(而不是仅仅使用reserve为它们保留空间而不实际创建),将在每个元素上调用默认构造函数。对于数字原语(例如ints 或doubles),默认构造函数的操作是将值设置为零。