- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:自作Assert関数が上手く動作しません...)
ポインタの初期化をしない場合にASSERT関数が正常に動作しない問題
このQ&Aのポイント
- C++で自作のASSERT関数を作成している場合、ポインタの初期化をしないとエラーが出力されない問題が発生します。
- ASSERT関数は、ポインタがNULLでない場合にエラーとして処理するため、ポインタをNULLで初期化する必要があります。
- 初期化されていないポインタをASSERT関数に渡すと、条件が満たされずエラーが出力されないので、ポインタの初期化が必要です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
逆に質問しますが、ポインタが初期化されているかされていないかを実行時に判定できると考えていますか? ASSERT(p);はpが初期化されているかどうかを判定しているのではなく、0と等しいかを判定しているんです。 未初期化のポインタは不定値になっています。 どこかの実体(char*の場合、char型の変数)のアドレスで初期化してあれば、何らかのアドレスが入っていますが、その有効なアドレスと未初期化ポインタの不定値の区別とつけることは不可能です。 char a; char*p1 = &a; // p1をaのアドレスで初期化、p1にはポインタとして有効な値は入っている char*p2; // 不定値になっているが、その値をは有効なアドレスか無効なアドレスかは不明 char*p3 = NULL; // 無効なアドレスで初期化、p3はポインタとして無効な値(0)が入っている p1, p2は0以外なのでアサートされません。 あなたの希望はp2がアサートされることですか?それは不可能です。 未初期化変数を検出するには、実行時に検出(ASSERT)するより、コンパイル時に検出する方が簡単で、コストがかかりません。VC++なら警告が出せるはずですので、わざわざASSERTでチェックするのは無駄と思います。 どうしても未初期化ポインタを実行時に見つけたい場合、スマートポインタを使用するのが有効と思われます。
お礼
返答が遅くなってすみません。 さっそくご回答ありがとうございます! C/C++の標準Assertでは、未初期化変数もエラー出力してくれたので、実行時に判断できる方法があるのかと考えていました。 「未初期化変数を検出するには、実行時に検出(ASSERT)するより、コンパイル時に検出する方が簡単で、コストがかかりません。VC++なら警告が出せるはずですので、わざわざASSERTでチェックするのは無駄と思います。」 この回答で納得できました。確かにコンパイル時に検出して警告を解消していくべきですね 適切なご回答ありがとうございました。もちろんベストアンサーにさせていただきます