2011-08-16 5 views
4

STLデフォルトアロケータは、オブジェクトを配置する前にRAWメモリをゼロにしますか?このコードを参照してください。このコメントは私のプラットフォームでの動作を反映しています。初期化されていないクラスフィールドとSTLコンテナ

#include <iostream> 
#include <vector> 

struct Foo 
{ 
    Foo() {} // n isn't initialized 
    int n; 
}; 

int main() 
{ 
    std::vector<Foo> v(2); // zeroed 
    std::cout << v[0].n << '\n'; 
    std::cout << v[1].n << '\n'; 

    Foo foo; // contains garbage 
    std::cout << foo.n << '\n'; 
} 

ゼロメモリ未使用メモリを無効にすることはできますか? PODを初期化する値と同じではないことに注意してください。

+0

なぜそれを無効にするのか説明できますか?効率性の問題またはその他の理由? –

答えて

2

コンテナは、特定の値を与えないと、作成するオブジェクトをデフォルトで初期化します。あなたのケースでは、オブジェクトのデフォルトコンストラクタはではありません。はPOD整数を初期化します。したがって、メモリに残っているものはすべて含まれます。

OSによって新しいヒープブロックがゼロに初期化されることがありますが、それにはカウントできません。ブロックは再利用できるようになり、最後に使用されたときの残りのゴミが再び含まれます。

悪用に非常に敏感なコードは、パスワードなどの重要な変数に対するメモリをゼロにしてから、破棄します。

+0

説明していただきありがとうございます。 – pic11

4

メモリがゼロになることがあります。そうではないかもしれない。 Windowsがメモリをゼロにする習慣があることはわかっています。 1つのことは確かです。それは定義されておらず、標準APIではコントロールの設定が見つかりません。

+0

これです。イニシャライザのリストでnを初期化するだけです。 – stijn

+0

@stijn:いいえ、彼は*無効にしたい* enable *しません。 – Puppy

1

あなたのフリーストアがゼロ充填されているように見えますが、コールスタックはありません。 C++はここでゼロ初期化をしていませんが、これはコンテナとは関係ありません。

私はあなたがしようとした場合、あなたが同じが表示されます数える

#include <iostream> 
#include <vector> 

struct Foo 
{ 
    Foo() {} // n isn't initialized 
    int n; 
}; 

int main() 
{ 
    Foo foo; // arbitrary values 
    std::cout << foo.n << '\n'; 

    Foo* p = new Foo; // zero values 
    std::cout << p->n << '\n'; 
    delete p; 
} 

(残念ながら、ideone.comは恥である自動ストレージ変数の挙動を示さない。おそらく何かを。 g++は、スニペットのために呼び出された。それでもロックダウンされた環境で、I get to show off my cunning use of #pragma!)


これを制御するために、何のC++方法はありませんし、私の知る限りでは、それを制御するために、何のWindowsまたはLinuxの方法はありません。

なお、この要件を導いたのは、なぜ非初期化に頼らざるを得ないかという良い例です。

0

Vectorは、デフォルトで初期化されたオブジェクトのコピーで要素を初期化します。したがって、任意の値のコピーが得られます。この動作を無効にする方法はありません。

関連する問題