shared_ptr简介

shared_ptr简介

写的code不够多,知识面确实相当缺乏,若不是VS2008开始支持TR1,真不知道有个shared_ptr,只知道有个auto_ptr,翻了下Google,发现早在两年前(甚至更早)shared_ptr就已经在TR1和Boost里面了。

  shared_ptr有何本事?简单说就是用来管理被共享的资源的,举个例子:

 

#include <iostream>
#include <memory>
 
class B
{
public:
  B() { std::cout << "构造" << std::endl; }
  ~B() { std::cout << "析构" << std::endl; }
};
 
class A
{
  B *p;
public:
  A(B *init) : p(init) {}
};
 
void testptr()
{
  B *lp = new B();
  A a1(lp);
  A a2(lp);
  //delete lp;
}
 
int main()
{
  testptr();
 
  system("pause");
  return 0;
}

这里a1和a2共享了一个资源lp,而lp是用new动态分配的,必须显示的调用delete删除,但是该在哪删除?由谁来删除?删除后怎么通知a1和a2?解决这些问题必须自己另行设计。
如果使用shared_ptr,一切将变得简单。shared_ptr内部维护一个表示它所管理的资源的引用计数,当shared_ptr被创建时引用计数加1,被销毁时减1,当减到0的时候shared_ptr将自动调用delete删除它所管理的资源:

#include <iostream>
#include <memory>
 
class B
{
public:
  B() { std::cout << "构造" << std::endl; }
  ~B() { std::cout << "析构" << std::endl; }
};
 
class A
{
  std::tr1::shared_ptr<B> p;
public:
  A(std::tr1::shared_ptr<B> init) : p(init) {}
};
 
void testptr()
{
  std::tr1::shared_ptr<B> lp(new B());
  A a1(lp);
  A a2(lp);
}
 
int main()
{
  testptr();
 
  system("pause");
  return 0;
}

这里有3个shared_ptr:lp、a1.p、a2.p,当执行完A a2(lp)这句时,lp、a1.p、a2.p的引用计数都为3,当执行完testptr()函数后,3个shared_ptr被依次销毁,引用计数依次减1,当减到0时,最后一个被销毁的shared_ptr将自动调用delete删除它所管理的共享资源B。
可以看到shared_ptr十分强大方便,这只是个简单的例子,shared_ptr还可以自定义删除方法,还有个配套使用的weak_ptr,具体还是参考MSDN吧。
有一点遗憾就是shared_ptr的析构函数是调用delete而不是delete []来删除资源,这意味着用shared_ptr来管理数组是个馊主意:

std::tr1::shared_ptr<int> lp(new int[5]);

更无奈的是居然可以正常编译。TR1里没有管理数组的智能指针,Boost里有,叫shared_array。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值