背景:
スマート ポインターについて読んでいるときに、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..
}
質問:
このスマート ポインターには、スコープ外になると Person クラス オブジェクトが削除されるという利点があります。しかし、「delete p;」というコードを具体的に追加する必要がありますか? スマートポインタクラスがそれ自体をリークしないようにメイン関数で?
Person クラスにもデストラクタ関数があるので、本当に person のオブジェクトに対して delete を呼び出す必要があるのでしょうか? Person オブジェクトが範囲外になると、デストラクタが自動的に呼び出されます。