1

私は c++ でアプリケーションを作成しており、Intel インスペクタを使用してメモリ プロファイリングを行っています。

ただし、潜在的なメモリの問題を見つけるためのメモリ プロファイリング テストで得たさまざまな結果について質問があります。

私はより安定したアプリケーションを作ろうとしていますが、いくつかの質問がありますが、現時点ではまだコードを調べすぎて、ちょっと混乱している基本的なものです。それらを明確にするのを手伝ってくれてありがとう。

  1. char buffer[30] をデフォルト値に初期化する必要がありますか?
  2. LPWSTR のデフォルトの値はどうあるべきか (NULL を試してみました)、メンバー変数への初期化されていないメモリ アクセスを訴えます。
  3. 構造体を初期化します。memset を使ってみました。それでも、プロファイラーは不機嫌そうに見え、初期化されていないメモリ アクセスに文句を言います。

1つのインスタンスは、呼び出し元クラスのコンストラクターで、ハンドルを次のように初期化しました

m_hidHandle = NULL; //member variable and an object of struct hid_device

その後、hid_write を呼び出します。

そしてそこに、 writeFile を呼び出す hid_write が含まれています (これは API クラス hid.c です)。

WriteFile(dev->device_handle, buf, length, NULL, NULL);

ここで、メモリアクセスが初期化されていないという苦情が表示されます。WrtieFile の API ドキュメントもチェックしてみました。メモリの問題について不平を言うために私が作っているものはまだ汚れています。

別のインスタンスは、メンバー変数を持っていることです

WINHTTP_CURRENT_USER_IE_PROXY_CONFIG m_pConfig;

コンストラクターで、構造体を NULL に初期化しようとしています。

memset( &m_pConfig, 0, sizeof(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG) );

初期化されていないメモリアクセスがありました。私も試してみました

//proxyConfig.fAutoDetect = false;
//proxyConfig.lpszAutoConfigUrl = NULL;
//proxyConfig.lpszProxy = NULL;
//proxyConfig.lpszProxyBypass = NULL;

まだ助けはありません。

4

1 に答える 1

4

1: 使用するstd::stringと、デフォルトで初期化されます:

std::string s; //empty

それ以外の場合は、char s[30] = {};0 で埋めます。std::string安定したアプリケーションにとっては、はるかに優れています。API に渡す C 文字列が必要な場合はc_str()、定数バージョンを取得するために使用します。非定数バージョンが必要な場合は、それを文字のベクトル (2 つのイテレータで初期化できます) にプロットし、 または のいずれ&v[0]かを渡しますv.data()

2: (Windows API データ型を想定) であるため、動作NULLするはずです。wchar_t *C++11 を使用している場合は、nullptr代わりに使用してください。

3:memset非 POD クラスにとってはひどい考えです。コンストラクターがない場合は、デフォルトのコンストラクターが提供されます。このコンストラクターは、自明でない構築可能なすべてのメンバーをデフォルトで初期化します。のようなメンバーがある場合は、独自に配置することをお勧めします。intそうしないと、初期化されないままになります。

struct S {
    int i;
    std::string s; //non-trivially constructible, so default-initialized
};

S s;

上記の例では、空の文字列と uninitialized が返されますint。そのため、通常は自分のほうが優れています。

S() : i(), s() {}
于 2012-12-12T15:42:52.647 に答える