1

私はある種のスマートポインタ技術に取り組んでいますが、欠けている部分が1つあります。いくつかの組み合わせを試しましたが、ロジックは次のとおりです。

UInt *obj = new UInt;
UInt *ref;
ref = obj;

delete obj;
obj = NULL;

if (ref == NULL)
{
    // It works
}
else
{
    // It failed
}

refを明示的にNULLに設定せずに「ItWorks」を押す方法はありますか?

編集:

より適切なシナリオは、次のようなものです。

class A
{
public:

    A(): ref(NULL) {}
    ~A()
    {
        if (ref != NULL)
            delete ref;
    }
    int *ref;
};

    int *obj = new int;
    A *host = new A();

    host->ref = obj; ???

    delete obj;
      obj = NULL;

    if (host->ref == NULL)
    {
        // It works.
    }
    else
    {
        // It failed.
    }

..。

ただし、クラスメンバーとしてint *&refを使用することはできません。

4

3 に答える 3

4

あなたが言うように、スマート ポインターを使用する必要があります。

#include <memory>

std::shared_ptr<UInt> obj = std::make_shared<UInt>();
std::weak_ptr<UInt> ref = obj;

obj.reset();

if (ref.expired())
{
    // It works
}
else
{
    // It failed
}

標準ライブラリにメモリを管理する機能がある場合は、自分でメモリを管理しようとしないでください。

于 2013-02-01T16:47:08.560 に答える
3

ポインターへの参照として ref を宣言する

Uint*& ref = obj;

ref は obj ポインターを参照するようになります。

于 2013-02-01T16:39:52.903 に答える
1

最初は両方objref、(同じ)UIntインスタンスを指します。次に、インスタンスを削除してに設定objNULLます。ただしref、他の通常のポインタとまったく同じであるため、削除されたインスタンスを指します。

&代わりに、宣言に追加することで、参照変数、この場合は「参照ポインター」を作成できます。

Uint*& ref = obj;

次に、ref実際にを参照しobj、と同じ値(ポインタ)を保持しobjます。

于 2013-02-01T16:41:49.593 に答える