是个对象,不是数据类型,对象里有个普通指针和内存被引用个数
std::auto_ptr
boost::scoped_ptr
boost::shared_ptr
boost::scoped_array
boost::shared_array
boost::weak_ptr
boost:: intrusive_ptr
普通指针缺点:
普通指针指向的内存需要手动delete
class ptr
{
friend class smart_pointer;
int count;
int* pointer;
};
class smart_pointer
{
public:
smart_pointer(arguments);
~smart_pointer();
//含参数构造函数
smart_pointer(int* p)
{
pointer = p;
pointer.count = 1;
}
smart_pointer()
{
pointer.pointer = NULL;
pointer.count = 0;
}
//赋值操作
smart_pointer& operator=(smart_pointer& p)
{
p.pointer.count ++;
if(pointer.count)
{
pointer.count --;
if(pointer.count == 0)
{
delete pointer.pointer;
pointer.pointer = NULL;
}
}
pointer.pointer = p.pointer;
pointer.count = p.count;
return *this;
}
//拷贝构造函数
smart_pointer(smart_pointer& p)
{
pointer.pointer = p.pointer;
pointer.count = p.count;
}
private:
ptr pointer;
/* data */
}; ### boost::shared_ptr boost智能指针的引用计数也是个类,count赋值操作如下
shared_count & operator= (shared_count const & r) // nothrow
{
sp_counted_base * tmp = r.pi_;
if( tmp != pi_ )
{
if( tmp != 0 ) tmp->add_ref_copy();
if( pi_ != 0 ) pi_->release();
pi_ = tmp;
}
return *this;
}