このコード スニペットでは、Init() 関数は、構造体のすべてのメンバー変数を埋めるオンデマンドの初期化子として機能します。これは、スタック上の大きな配列のすべてのメンバーがデフォルト コンストラクターを呼び出さないようにするために行われます。
struct Foo {
int m_Member;
void Init(int i);
};
void Foo::Init(int i) {
m_Member = i;
// Many other members initialized here.
}
void SomeFunction(int n) {
Foo buffer[64];
assert(n <= 64);
// Explicitly initialize what is needed.
for (int i = 0; i < n; ++i) {
buffer[i].Init(i * 3);
}
// Use buffer[0] - buffer[n-1] somehow.
}
これにより、VS2012 で /analyze を使用して静的分析エラーが発生します。
warning C6001: Using uninitialized memory 'buffer'.: Lines: 17, 19, 20
この警告が発生しないように Foo::Init() に注釈を付ける方法を探しています。警告を消す方法は他にもたくさんあります。
- 空のコンストラクターの追加
- Init() をコンストラクターに移動し、placement new をループ内で呼び出す
しかし、コードの構造を変更することは避けたいと思います。
次の注釈を試してみましたが、成功しませんでした:
void _At_(this, _Out_) Init();
この構文は受け入れられますが、警告を次のように変更するだけです。
warning C6001: Using uninitialized memory 'buffer'.: Lines: 18, 20, 21
warning C6001: Using uninitialized memory 'buffer[BYTE:0]'.: Lines: 18, 20, 21
この Init() 関数の意図を静的分析エンジンに宣言する方法を知っている人はいますか?