share_ptr的正确使用方法

5 篇文章 0 订阅
4 篇文章 0 订阅

实在是看不惯度娘出来的share ptr的例子,没有实用性,而且还不清晰,举一个场景如下:

假设游戏玩家登陆时要登记到一个管理用的vector中,登出时删除,程序如下:

注意对象时在函数结束时才被释放的。

 

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/noncopyable.hpp>

#include <iostream>
#include <vector>
#include <string>

using namespace std;
class player;

typedef boost::shared_ptr<player> pplayer;
typedef vector<pplayer> player_container;

player_container PC;

class player:public boost::enable_shared_from_this<player>,boost::noncopyable
{
public:
 player(string name_)
 {
  name = name_;
  cout << "new>>>>" << name <<":"<<__FUNCTION__ << ":" << __LINE__ << endl;
 }

 ~player()
 {
  cout << "delete>>>>" << name <<":"<< __FUNCTION__ << ":" << __LINE__ << endl;
 }

 static pplayer CreatePlayer(string name)
 {
  pplayer pp(new player(name));
  return pp;
 }

 void Login()
 {
  cout << name  <<" login:" << endl;
  PC.push_back(shared_from_this());
 }

 void Logout()
 {
  cout << name << " logout " << endl;
  pplayer me = shared_from_this();
  player_container::iterator it = std::find(PC.begin(), PC.end(), me);
  PC.erase(it);
 }

 string GetName() const
 {
  return name;
 }
private:
 string name;
 int account;
 int charid; 
};


void player_manager()
{
 pplayer pp1 = player::CreatePlayer("zhangSan");
 pp1->Login();
 pp1->Logout();

 pplayer pp1_new = pp1;
 pplayer pp1_new2 = pp1;

 cout << "pp1 share count: " << pp1->shared_from_this().use_count() << endl;
 pplayer pp2 = player::CreatePlayer("LiSi");
 pp2->Login();
 pp2->Logout();

 pplayer pp3 = player::CreatePlayer("Wang2Mazi");
 pp3->Login();
 pp3->Logout();
}

int main(int argc,char**agrv)
{
    player_manager();
 system("pause");
 return 0;
}

 

 



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值