智能指针shared_ptr

概要:主要解决上一篇的内存泄露以及复制构造函数问题

//主函数test如下

#include
using namespace std;
//#include
#include"shared_ptr.h"

void main()
{ int *p = new int(10);

        shared_ptr ps1(p);

shared_ptr ps2;

ps2 = ps1;//复制拷贝(浅拷贝)
cout<<"use_count = "<

1.内存泄露

在库函数里shared_ptr中未给出明确的析构函数,则选择在shared_count类中增加析构函数并用基类指针pi_调用release()函数,在基类中实现

//引用计数类shared_ptr

~shared_count()
{if(pi_!=0)
{pi_->release(); }}

//基类sp_shared_base

public:
virtual void dispose()=0;//定义纯虚函数dispose()则该类是抽象类,根据c++继承的子类sp_count_impl_xx一定要实现纯                                                                                                                                                                    //虚函数
void release()
{
if(--count_==0)
dispose();//子类sp_count_impl_xx实现
}

//子类sp_count_impl_xx

~sp_count_impl_xx()
{
#ifdef DISPLAY
cout<<"free sp_count_impl_xx."<#endif
delete px_;//释放主函数new 申请的p空间int 4个字节,再释放自身对象
}
void dispose()
{
//不能直接delete px_因为基类还存在纯虚函数产生虚表指针占4个字节
delete this;//通过该对象自杀行为来调用析构函数
}

private:
T* px_;};

2.复制构造函数

//shared_ptr共享指针类

shared_ptr(const shared_ptr &r):px(r.px),pn(r.pn)//拷贝构造函数
{
#ifdef DISPLAY
cout<<"copy shared_ptr."< #endif
}
shared_ptr& operator=(shared_ptr &p)//赋值构造函数
{
if(this!=&p)
{
shared_ptr(p).swap(*this);//创建无名对象,调用swap方法
}
return *this;//返回当前对象本身
}
void swap(shared_ptr &q)
{
std::swap(px,q.px);//调用VS库中swap()函数
pn.swap(q.pn);//pn为shared_count类中成员,需在该类中实现swap()函数
}

//shared_count类

void swap(shared_count &p)
{
sp_shared_base *tmp = p.pi_;//建立临时基类指针
p.pi_ = pi_;
pi_ = tmp;
}

PS:可参考上一篇shared_ptr

你可能感兴趣的:(共享指针,boost)