1. ホーム
  2. c++

[解決済み] C/C++のNULLポインタのチェック [終了しました]。

2022-04-21 14:39:33

質問

最近のコードレビューで、ある貢献者が、すべての NULL は、ポインタに対するチェックを次のように行う。

int * some_ptr;
// ...
if (some_ptr == NULL)
{
    // Handle null-pointer error
}
else
{
    // Proceed
}

ではなく

int * some_ptr;
// ...
if (some_ptr)
{
    // Proceed
}
else
{
    // Handle null-pointer error
}

しかし、このコードに取り組んでいる人なら誰でも、ポインタ変数を if 文は、暗黙のうちに NULL . また、2番目の方法の方が、この種のバグが発生する可能性が少ないと感じています。

if (some_ptr = NULL)

を見つけるのも、デバッグするのも、まったくもって面倒です。

どちらの方法が良いか、またその理由は?

解決方法は?

私の経験では if (ptr) または if (!ptr) が望ましい。これらは、シンボル NULL . 偶発的な割り当ての可能性を排除することができます。そして、明確で簡潔である。

編集する。 SoapBoxがコメントで指摘しているように、以下のようなC++のクラスと互換性があります。 auto_ptr への変換を提供するもので、ポインタとして機能するオブジェクトである。 bool を使えば、まさにこのイディオムを実現することができます。これらのオブジェクトでは NULL はポインタへの変換を呼び出さなければならず、これは他の意味での副作用があるかもしれません。 bool 変換が意味するものです。

私は、不要なテキストを排除して意味を述べているコードを好みます。 if (ptr != NULL) と同じ意味です。 if (ptr) が、その代償として冗長な特異性を持つ。次に論理的なのは if ((ptr != NULL) == TRUE) そして、その道は狂気に満ちている。C言語では if , while などは、0以外の値が真、0が偽という具体的な意味を持つ。冗長性では明確にはならない。