删除smartpointer对象?

时间:2012-09-18 07:48:09

标签: c++ smart-pointers

背景:
在阅读有关智能指针的内容时,我遇到了以下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;”在main函数中,智能指针类不会自行泄漏?

  2. 由于Person类也有析构函数,我们真的需要在person的对象上调用delete吗?当Person对象离开范围

  3. 时,将自动调用析构函数

2 个答案:

答案 0 :(得分:2)

[1]您在堆栈上分配时不需要删除p。如果你这样做了:

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

然后你必须删除它。

[2]您无需在delete对象上调用Person。这是由智能指针完成的 - 毕竟这是它的目的。

因此,您的代码在当前状态下没有任何内存泄漏。 但是,智能指针实现缺少复制构造函数,赋值运算符等,因此应添加它们以避免将来出现意外行为。

答案 1 :(得分: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(如果编译器中不存在上面的智能指针类)。