shared_ptr 复杂应用

本文通过实例演示了如何使用C++中的shared_ptr来管理对象的生命周期,并展示了如何将其用于容器中,以及如何置空和检查shared_ptr是否为空。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//因为使用了 shared_ptr
//1.基类的析构即使不是 virtual 也可以正确的释放
//  这一点很重要,可以防止容器内的指针被以外释放
//2.shared_ptr 对象可以作为STL容器的对象
//3.shared_ptr 如何置 0
//3.shared_ptr 如何判断空值
#include <cstdlib>
#include <vector>
#include <iostream>
using namespace std;
#include <boost/shared_ptr.hpp>
using namespace boost;
class A
{
protected:
  int m_n;
public:
  A(int n):m_n(n){}
  virtual void Ring(){cout<<"A("<<m_n<<") ringing!"<<endl;}
protected:
  virtual ~A(){cout<<"A("<<m_n<<") 析构"<<endl;}
};
class B:public A
{
public:
  B(int n):A(n){}
  virtual ~B(){cout<<"B("<<m_n<<") 析构"<<endl;}
  virtual void Ring(){cout<<"B("<<m_n<<") ringing!"<<endl;}
};
shared_ptr<A> Create(int n)
{
  shared_ptr<A> p(new B(n));
  return p;
}
void Do()
{
    cout<<"-----------------------------"<<endl;
    vector<shared_ptr<A> > Myvec;
    for(int i = 0; i < 10; i++)
    {
      Myvec.push_back(Create(i));
    }
    typedef vector<shared_ptr<A> >::iterator iterator;
    iterator it = Myvec.begin(),itend = Myvec.end();
    int i = 0;
    for(;it != itend;it++)
    {
      if(i == 0 || i == 5)
        (*it).reset();
      i++;
      if((*it))
        (*it)->Ring();
    }
    cout<<"-----------------------------"<<endl;
}
int main(int argc, char *argv[])
{
    Do();
    system("PAUSE");
    return EXIT_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值