6

プログラミングを行っている間、アサートとNULLポインターの検証を使用しています。

しかし、私が知っているように、assert はDEBUGモードでのみ役に立ちます。

私の質問は、ポインターを返す NULL の例関数であると確信できない内部ポインターがあると仮定します (ただし、ポインターはクラスのメンバーではありません)。そのような場合、assertを使用できます。

test* ptr = fun(); // return a pointer of type test
assert(ptr);

//do some operation

またはNULLポインターの検証

test* ptr = fun(); // return a pointer of type test
assert(ptr);
if (NULL != ptr)
{
    //do some operation
}

ここでは、どのコード プラクティスが優れているかを説明します。控えめに言っても、2 つ目になります。考えられない異常なケースが原因で、 ptrの値がNULLを返す状況に直面したためです。

しかし、他にもっと良い選択肢はありますか?

4

5 に答える 5

4

assert「これが正しくない場合、コードに論理エラーがあります」と表示されます。ポインターが null である可能性があるという事実を処理するコードを挿入している場合、それは冗長な assert 呼び出しです。代わりに、ロギングと処理を「else」ケースに追加する必要があります。このようにして、null ポインターの場合でも、デバッグ ビルドはリリース ビルドと同じように実行されます。

本当にアサートするつもりで、null ポインターで中止する必要がある場合は、リリース ビルドでアサートを有効にするか、別のリリース対応アサート メカニズムを使用します。

デバッグのみのアサートの唯一の理由は、リリース コードで作成するにはコストがかかりすぎる論理エラーのチェックです。通常、ポインターの null チェックはこのカテゴリには当てはまりません。

于 2013-01-11T07:08:02.687 に答える
3

実際の解決策は、関数のセマンティックに依存しますfun

戻り値NULLが意味的に無効な場合、戻り値の代わりに適切な例外 ( 1funなど) をスローする必要があると思います。呼び出しサイトで使用して、正常に動作していることを確認し、正常に動作していない場合はプログラムを中止できます。 . この方法では、バグはすぐに検出されるため、プログラムの残りの部分には伝播しません。std::logic_errorNULLassertfunfun

ただし、NULLfrom からの戻りfun が意味的に有効な場合は、call-site を使用して戻り値を確認するif必要assertがあり、この場合はifとにかく使用するため、実際には必要ありません。

std::runtime_error1. または、またはを使用できますstd::domain_error

于 2013-01-11T06:58:37.430 に答える
1

アサーションには独自のコードを使用することをお勧めします。あなたが言ったように、アサートはデバッグモードでのみ機能します。

そのため、リリース モードで動作している場合は動作しません。

独自のアサーション コードを使用する場合。何が間違っているかを簡単に見つけることができます。

test* ptr = fun(); // return a pointer of type test
MyOwnAssert(ptr); 

void MyOwnAssert(void* pPointer)
{
   if (NULL == pPointer)
     abort();
}    
于 2013-01-11T07:06:12.873 に答える
0

何を assert にするかはあなた自身の選択です: 必要に応じて本番環境で使用できます。

エラーを早期に発見したい場合は、 assert() を使用する方が良いと思います。特に、それが NULL ポインターであるという事実が発生してはならない場合。そこにGoogle Breakpad
を 貼り付けて、NULL ポインターにヒットするたびに、その時点での完全なスタックを含むレポートを送信することもできます。

NULL ポインターが可能である (場合によっては期待される...) 場合は、NULL チェックの方が優れていると思います。しかし、この時点で、渡される NULL ポインターに対応する必要がある場合、コードは何らかの形で間違っていると言えます。

于 2013-01-11T07:11:41.873 に答える
0

おっしゃったように、アサートはデバッグ中にのみ行われ、プログラマーがどこで問題が発生したかを特定するのに役立ちます。本番環境では価値がないため、ポインターが NULL である可能性があることに疑いがある場合は、2 番目の方法を使用することをお勧めします。

于 2013-01-11T06:57:10.677 に答える