私が知っていることを行うための切り替えはありません。それが存在したとしても、それは単なる「デバッグ」機能であり、本番コードでは使用されません。
例:電気柵ライブラリには、メモリを0またはに初期化するオプションがあります0xff
EF_FILL 0〜255の値に設定すると、割り当てられたメモリのすべてのバイトがその値に初期化されます。これは、初期化されていないメモリの読み取りを検出するのに役立ちます。-1に設定すると、一部のメモリはゼロで埋められ(ほとんどのシステムではオペレーティングシステムのデフォルト)、一部のメモリは最後の使用時に書き込まれた値を保持します。
(自動メモリではなく、割り当てられたメモリに対してのみ機能します)。
標準として定義されていない/標準で定義されていないスイッチに依存すると、コードが移植できなくなります。ある時点で、誰かがあなたのコードを使用して他のプラットフォームでクロスコンパイルし、それは失敗します。
ヘルプ/セーフガードとして、Coverity(注:私はこの会社と提携していません)のようないくつかのツールは、コード内の初期化されていないPODメンバーを検出できます。同じことをする無料のツールがあるかもしれません。
したがって、1つまたは2つのPODメンバー(c ++ 11)の場合に私が行うことは次のとおりです。
class Foo
{
...
private:
int x = 0;
int y = 0;
};
数え切れないほどのメンバーがいる場合は、PODクラス/構造体を作成し、このタイプで1つのメンバーを作成し、最も効果的な初期化を使用して0に初期化します。
class Foo
{
...
private:
struct Pod
{
int x,y,z,whatever;
};
Pod m = {0};
};
それは、のようなメンバーにアクセスすることを強制しますm.x
...透明ではありません
または(少しハッキーかもしれませんが機能します)、POD構造を作成し、そこからクラスを継承します。memset
デフォルトのコンストラクターでPOD構造のサイズに適用できるようになりました
struct Pod
{
Pod()
{
std::memset(this,0,sizeof(Pod));
}
int x,y,z,whatever;
};
class Foo : private Pod
{
public:
...
private:
std::string name;
std::vector<int> elements;
};
この値は、のメンバーのみを0に設定sizeof(Pod)
することを保証します。memset
Pod
Pod
変更できないC構造体からのものである場合は、コンストラクターでmemset
ステートメントを移動できます。Foo
sizeof(Pod)