2016-11-02 28 views
0

私は最近、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()は常にtruearray_zeroed()しばらく戻っfalseを返すようです。

私は明らかにここに何かが欠けていますが、私は何がわかりません。

+1

これはリリースモードで発生しますか? – tkausl

+1

どのようにしてベクターを作成しましたか? 'reserve'を使用した場合、メモリをゼロにしてはいけません。 – NathanOliver

+5

もっと明示してください。あなたが気づいたものは何ですか? *正確にあなたがそれに気付かれたコードは何ですか? 'std :: vector'sがメモリをゼロにしない状況を作り出すことができます。 'std :: vector'sがメモリをゼロにする状況を作り出すことができます。 – Yakk

答えて

2

CPPリファレンスマニュアル:

以下オーバーロードコンストラクタ初期化されていない、それらを残す、新しい[]の挙動とは異なるゼロアウトintなどの非クラスタイプの要素を、。

explicit vector(size_type count); (since C++11) (until C++14) 
explicit vector(size_type count, const Allocator& alloc = Allocator()); 
(since C++14) 

http://en.cppreference.com/w/cpp/container/vector/vector

+0

これは私が探しているものかもしれません。 new []は要素を初期化しないままにしますが、new []();ではない。 TIL –

3

n要素でstd::vectorを作成すると(実際には作成せずにreserveを使用して領域を予約するのではなく)、各要素に対してデフォルトのコンストラクタが呼び出されます。数値プリミティブ(例えば、intsまたはdoubles)の場合、デフォルトのコンストラクタの動作は値をゼロに設定することです。

関連する問題