注意:智能指针不是指针,而是模板!
auto_ptr 实现方式:权限转移 坚决不建议使用此模板
scoped_ptr 实现方式:防拷贝,防赋值(将拷贝构造函数和operator=设为私有)
shared_ptr 实现方式:引用计数 但是存在循环引用的问题,可能会造成内存泄漏
解决方案:
1.当剩下最后一个引用的时候,手动释放该对象
2.当对象a的生存周期超过b的时候,将b改为使用一个普通指针指向a
3.配合weak_ptr使用 ,weak_ptr可以生成一个shared_ptr的一个对象,但是weak_ptr是弱引用的,而且它能检测对象是否已经释放,
访问对象时必须通过lock访问,对象的生命周期交给shared_ptr
weak_ptr 的简洁声明如下
namespace
boost {
template<typename
T>class
weak_ptr {
public:
template
<typename
Y>
weak_ptr(const
shared_ptr<Y>& r);
weak_ptr(const
weak_ptr& r);
~weak_ptr();
T* get()
const;
bool
expired()
const; //检测对象是否已经被释放
shared_ptr<T> lock()
const;//用于获取强引用指针
};
}