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 回答