私は最近、std::vector
が割り振った後に0でメモリをクリアしていることに気付きました。なぜ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
を返すようです。
私は明らかにここに何かが欠けていますが、私は何がわかりません。
これはリリースモードで発生しますか? – tkausl
どのようにしてベクターを作成しましたか? 'reserve'を使用した場合、メモリをゼロにしてはいけません。 – NathanOliver
もっと明示してください。あなたが気づいたものは何ですか? *正確にあなたがそれに気付かれたコードは何ですか? 'std :: vector'sがメモリをゼロにしない状況を作り出すことができます。 'std :: vector'sがメモリをゼロにする状況を作り出すことができます。 – Yakk