11

私は最近のインタビューでこれを尋ねられました。基本的には、無料の機能とnullの割り当ての機能を組み合わせる関数を作成しています。私は次のように答えました:

void main()
{
      int *ptr;
      ptr = new int;
      ptr = newdelete(ptr);
}

(int*) newdelete (int *ptr)
{
      delete(ptr);
      return NULL;
}

したがって、実行後、関数から返すときにptrローカルtomainはnull値を保持しますnewdeleteNULLnewdelete関数で割り当てたばかりの場合、ptrローカルtonewdeleteはnullになり、ptrローカルtoはnullになりmainます。

私の解決策は正しかったと思います。インタビュアーもそれを受け入れました。しかし、彼は他の答えを期待していました。彼は、私が関数からを返さずNULL、それでも望ましい結果を達成すると主張していました。

それを達成する方法はありますか?私が考えることができるのは、ptrローカルのポインタへのポインタである別の引数を渡すことmainだけですが、なぜそれが私がしたよりも優れているのかわかりません!

4

4 に答える 4

36

それを達成する方法はありますか?

template <typename T> void safeDelete(T*& p){
    delete p;
    p = 0;
}

int main(int argc, char** arv){
    int * i = new int;
    safeDelete(i);
    return 0;
}
于 2010-07-02T07:08:28.247 に答える
8

彼は次のようなことを期待していたと思います。

void reset(int*& ptr)
{
      delete(ptr);
      ptr = NULL;
}

さらにクリーンな解決策は、 a boost::shared_ptr<>and を使用して単に を呼び出すことptr.reset()でした。しかし、これはオプションではなかったと思います。

于 2010-07-02T07:10:52.857 に答える
1

あなたはそうしない

のようなスマート ポインターを使用しauto_ptrshared_ptrそれ自体を null にします。

于 2010-07-02T10:03:57.603 に答える
1

要件が関数を書くことではなかった場合は、いつでもそれを行うマクロを書くことができます:

#define my_delete(x) { delete x; x = NULL; }

もちろん、このように呼び出すと、あらゆる種類の問題が発生します。

my_delete(ptr++)

だから、私は非マクロの方法を好むと思います。

于 2010-07-02T07:39:38.140 に答える