【发布时间】:2017-03-15 21:26:29
【问题描述】:
我最近注意到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;
}
vector_zeroed() 似乎总是返回 true 而 array_zeroed() 返回 false。
我显然在这里遗漏了一些东西,但我不知道是什么。
【问题讨论】:
-
在发布模式下会发生这种情况吗?
-
你是如何创建矢量的?如果你使用了
reserve,它不应该将内存归零。 -
请更加明确。您究竟注意到了什么?什么代码正是让你注意到了?我可以创建
std::vectors 不将内存归零的情况。我可以创建std::vectors 执行零内存的情况。 -
@NathanOliver:如果你使用
reserve,那么它不会在那里创建对象。它只是保留空间。他问的是如何在不初始化数据的情况下创建对象。 -
@NicolBolas:你不知道。事实上,他的第二段对我的暗示并非如此。
标签: c++ c++11 memory vector std