在C++11中有两个智能指针类型来管理动态对象,share_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指对象。
我们知道指针或引用在离开作用域时是不会进行析构的,但是类在离开作用域时会自动执行析构函数,所以我们可以用一个类来实现指针指针(unique_ptr本质上是一个类,只是可以像一个指针一样使用)。因此我们可以通过析构函数调用delete去释放资源。那么如何实现“独占”呢?我们可以在类中把拷贝构造函数和赋值运算声明为private,这样就不可以对指针指向进行拷贝了,也就不能产生指向同一个对象的指针。
因为把拷贝构造函数和赋值操作符都声明为delete或private,这样每一个智能指针要指向一个对象时只能是指向一个新实例化的对象而不能通过“=”或者拷贝去指向前面已经创建了的对象,例如“unique ptr=&aa”,这里调用了赋值操作符这是不可以的。
template<class T>
class SmartPtr{
public:
// 调用构造函数,所创建对象获取资源
SmartPtr(T* ptr = nullptr)
:_ptr(ptr)
{}
T& operator*() { return *_ptr; }
T& operator->() { return _ptr; }
// 析构时就将资源释放
~SmartPtr()
{
if (_ptr)
delete _ptr;
cout << "~SmartPtr Success" << endl;
}
private:
T* _ptr;
// C++11 中防止拷贝的方式:delete
SmartPtr (SmartPtr<T> const &) = delete;
SmartPtr& operator=(SmartPtr<T>& ) = delete;
};
void use_factory(T arg)
{
unique_ptr_ptr<Foo> p = factory(arg);
Foo *ptr = new Foo(arg);
//使用P
}//p离开了作用域,但它指向的内存会被释放掉
//ptr申请的内存没有被释放,造成了内存泄漏