0

背景:
スマート ポインターについて読んでいるときに、C++ でのスマート ポインターの次のサンプル実装に出くわしました。

template < typename T > class SP
{
    private:
    T*    pData; // Generic pointer to be stored
    public:
    SP(T* pValue) : pData(pValue)
    {
    }
    ~SP()
    {
        delete pData;
    }

    T& operator* ()
    {
        return *pData;
    }

    T* operator-> ()
    {
        return pData;
    }
};

class Person
{
    int age;
    char* pName;

    public:
        Person(): pName(0),age(0)
        {
        }
        Person(char* pName, int age): pName(pName), age(age)
        {
        }
        ~Person()
        {
        }

        void Display()
        {
            printf("Name = %s Age = %d \n", pName, age);
        }
        void Shout()
        {
            printf("Ooooooooooooooooo",);
        } 
};

void main()
{
    SP<Person> p(new Person("Scott", 25));
    p->Display();
    // Dont need to delete Person pointer..
}

質問:

  1. このスマート ポインターには、スコープ外になると Person クラス オブジェクトが削除されるという利点があります。しかし、「delete p;」というコードを具体的に追加する必要がありますか? スマートポインタクラスがそれ自体をリークしないようにメイン関数で?

  2. Person クラスにもデストラクタ関数があるので、本当に person のオブジェクトに対して delete を呼び出す必要があるのでしょうか? Person オブジェクトが範囲外になると、デストラクタが自動的に呼び出されます。

4

2 に答える 2

2

p[1]スタックに配置するので、削除する必要はありません。あなたがした場合:

SP<Person>* p = new SP<Person>(new Person("Scott", 25));

その後、それを削除する必要があります。

[2]オブジェクトを呼び出す必要deleteはありません。Personそれはスマート ポインターによって行われます。結局のところ、それがその目的なのです。

したがって、コードには現在の状態でメモリ リークはありません。ただし、スマート ポインターの実装には、コピー コンストラクター、代入演算子などがないため、将来の望ましくない動作を回避するために追加する必要があります。

于 2012-09-18T07:53:02.627 に答える
1

その実装を使用しないでください。次のクラスを使用します (優先順)。

std::shared_ptr/ std::unique_ptr(C++11).
std::tr1::shared_ptr/ std::tr1::unique_ptr(Vis Studio 2008 での C++11 以前のサポート)。
boost::shared_ptr/ boost::unique_ptr(上記のスマート ポインター クラスがコンパイラーに存在しない場合)。

于 2012-09-18T08:18:37.007 に答える