背景:
在阅读有关智能指针的内容时,我遇到了以下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;”在main函数中,智能指针类不会自行泄漏?
由于Person类也有析构函数,我们真的需要在person的对象上调用delete吗?当Person对象离开范围
答案 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
(如果编译器中不存在上面的智能指针类)。