6

質問:

関数でフェッチされた(作成されていない、フェッチされたばかりの)ポインターを削除する必要がありますか?例:

#include <SomeObject>

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }

class DraftObject
{
public:

    DraftObject() : _x(0) {}
    ~DraftObject(){}

    int CalculateSomething()
    {
        AnotherObject* aObj = SomeObject::getInstance()->getAObjPointer();

        /* Do some calculations and etc... */
        _x += aObj->GetSomeIntValue();

        SAFE_DELETE(aObj) // <-- Would you recomend this here?

        return _x;
    }

protected:
    int _x;
};

aObjは、SomeObjectインスタンスでも他の場合に再利用されます。SomeObject::getInstance()->getAObjPointer()私は続けて、必要なものすべてを常に求めることができましたが、私の個人的な意見SomeObject::getInstance()->getAObjPointer()->GetSomeIntValue()ほど読みやすくはありません。aObj->GetSomeIntValue()Boostの何か(shared_ptr、weak_ptr、さらにはauto_ptr)を使用しても心配する必要はないことはわかっていますが、これがどのように機能するかについてはもっと興味があります。ポインタを削除しないとメモリリークが発生しますか、それともポインタを削除するとメモリから削除され、他のスコープ(インスタンスオブジェクトおよび使用される可能性のある他の場所)に移動しますか?

何かご意見は?

乾杯。

4

3 に答える 3

5

場合によります。

SomeObject::getInstance()->getAObjPointer();呼び出しごとに異なるオブジェクトを返す場合、おそらくそうです。そうでなければ、いいえ。これは文書化する必要があります

また、「安全な削除」:

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }

全然だめです。そして醜い。これをコードで見たら、それを書いたプログラマーをからかうでしょう。の場合、削除pNULL安全です。

于 2012-07-16T21:50:09.807 に答える
0

APIに文書化する必要があります。

一部のライブラリは、内部データ構造にも保持されているため、ユーザーが削除してはならないポインタを返しています。他の人は、ユーザーが削除する必要のあるポインターを作成しています。

このクラスと関数を実際に自分で作成したと仮定すると、このインスタンスを他の場所(内部関数を含む)で使用しない場合は、関数の最後にあるポインターを削除することをお勧めします。

于 2012-07-16T21:57:16.510 に答える
0

いいえ、使用しないでdeleteください。オブジェクトのメモリの割り当てが解除され、後で使用できなくなります。

于 2012-07-16T21:49:44.560 に答える