boost智能指针使用

#include <iostream>
#include <tr1/memory>
#include <boost/scoped_ptr.hpp> //scoped_ptr还不属于tr1
#include <boost/scoped_array.hpp> //scored_array也不属于tr1
#include <boost/shared_array.hpp> //shared_array也不属于tr1

class CTest
{
public:
  CTest() : m_id(0) {}
  CTest(int id) : m_id(id) {}
  ~CTest()
  {
    std::cout << "id :" << m_id << "-Destuctor isbeing called\n";
  }
  void SetId(int id)
  {
    m_id = id;
  }
  int GetId()
  {
    return m_id;
  }
  void DoSomething()
  {
    std::cout << "id :" << m_id << "-DoSomething\n";
  }
private:
  int m_id;
};

int main(int argc, char* argv[])
{
  // scoped_ptr
  boost::scoped_ptr<CTest> pTest(new CTest);
  pTest->SetId(123);
  pTest->DoSomething();
 
  // error scoped_ptr(scoped_ptr const &) is private;
  // boost::scoped_ptr<CTest> pTest2(pTest);
  // error scoped_ptr & operator=(scoped_ptr const &) is private; 
  // boost::scoped_ptr<CTest> pTest2;
  // pTest2 = pTest;
  
  // scoped_array
  boost::scoped_array<CTest> pVecTest(new CTest[2]);
  pVecTest[0].SetId(111);
  pVecTest[0].DoSomething();

  // shared_ptr
  std::tr1::shared_ptr<CTest> pSt(new CTest);
  pSt->SetId(999);
  pSt->DoSomething();

  std::tr1::shared_ptr<CTest> pSt2(pSt); // ok
  pSt2->DoSomething();
  
  std::tr1::shared_ptr<CTest> pSt3; 
  pSt3 = pSt2; // ok
  pSt3->DoSomething();

  // weak_ptr
  std::tr1::weak_ptr<CTest> pWt(pSt);
  std::tr1::shared_ptr<CTest> pWtlock = pWt.lock();
  // pWt->SetId(12345); // error weak_ptr can‘t used directly
  // pWt->DoSomething(); // error
  if (pWtlock == pSt)
    {
      std::cout << "pWt up to shared_ptr ok!\n"; 
      pWtlock->SetId(12345);
      pWtlock->DoSomething();
    }

  // shared_array
  boost::shared_array<CTest> pVecSt(new CTest[2]);
  pVecSt[0].SetId(888);
  pVecSt[0].DoSomething();

  // auto_ptr
  std::auto_ptr<CTest> pAt(new CTest);
  pAt->SetId(789);
  pAt->DoSomething();
   
  std::auto_ptr<CTest> pAt2(pAt);
  pAt2->DoSomething();

  std::auto_ptr<CTest> pAt3;
  pAt3 = pAt2;
  pAt3->DoSomething();
  std::cout << "pAt = " << pAt.get() << std::endl; // !!! 
  std::cout << "pAt2 = " << pAt2.get() << std::endl;

  return 0;
}

运行结果:

$ ./a.out 
id :123-DoSomething
id :111-DoSomething
id :999-DoSomething
id :999-DoSomething
id :999-DoSomething
pWt up to shared_ptr ok!
id :12345-DoSomething
id :888-DoSomething
id :789-DoSomething
id :789-DoSomething
id :789-DoSomething
pAt = 0
pAt2 = 0
id :789-Destuctor isbeing called
id :0-Destuctor isbeing called
id :888-Destuctor isbeing called
id :12345-Destuctor isbeing called
id :0-Destuctor isbeing called
id :111-Destuctor isbeing called
id :123-Destuctor isbeing called

总结:

auto_ptr作为早期C++标准库函数因其诡异的行为而被诟病(被复制后原指针为NULL)

shared_ptr和weak_ptr已经纳入了std::tr1标准库内,引用计数型智能指针行为正常,一般和weak_ptr配合使用

shared_array用于new[]的智能数组指针,scoped_ptr,scoped_array和shared类似但不容许复制行为,它们都定义在boost库内,不属于标准C++库,不建议在工作环境中使用

时间: 2024-12-25 02:46:31

boost智能指针使用的相关文章

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

Boost智能指针-基础篇

简介 内存管理一直是 C++ 一个比较繁琐的问题,而智能指针却可以很好的解决这个问题,在初始化时就已经预定了删除,排解了后顾之忧.1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr(现以废弃),它基本上就像是个普通的指针:通过地址来访问一个动态分配的对象.std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包含的对象.当然这要求在初始化的时候,传给它一个由new操作符返回的对象的地址.既然std::auto_pt

boost智能指针之shared_ptr和weak_ptr

std::auto_ptr很多的时候并不能满足我们的要求,比如auto_ptr不能用作STL容器的元素.boost的smart_ptr中提供了4种智能指针和2种智能指针数组来作为std::auto_ptr的补充. shared_ptr<boost/shared_ptr.hpp>:使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全. weak_ptr<boost/weak_ptr.hpp>:weak_ptr 是 shared_ptr 的观察员.它不会干

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: 1 #include <string> 2 #include <iostream> 3 #include <boost/scoped_ptr.hpp> 4 5 class implementation 6 { 7 public: 8 ~implementation() { std::cout <<&

Boost智能指针-基础知识

简单介绍 内存管理一直是 C++ 一个比較繁琐的问题,而智能指针却能够非常好的解决问题,在初始化时就已经预定了删除.排解了后顾之忧.1998年修订的第一版C++标准仅仅提供了一种智能指针:std::auto_ptr(现以废弃),它基本上就像是个普通的指针:通过地址来訪问一个动态分配的对象. std::auto_ptr之所以被看作是智能指针.是由于它会在析构的时候调用delete操作符来自己主动释放所包括的对象. 当然这要求在初始化的时候,传给它一个由new操作符返回的对象的地址.既然std::a

boost 智能指针的使用

最近在学习Boost的智能指针,下面对一些很好的文章进行整理如下: Boost智能指针——scoped_ptr http://www.cnblogs.com/TianFang/archive/2008/09/15/1291050.html Boost智能指针——shared_ptr http://www.cnblogs.com/TianFang/archive/2008/09/19/1294521.html Boost智能指针——weak_ptr http://www.cnblogs.com/T

Boost智能指针——shared_ptr

转: http://www.cnblogs.com/TianFang/archive/2008/09/19/1294521.html boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法: #include <string> #include <iostream> #inclu

5 C++ Boost 智能指针

智能指针类模板[图] scoped_ptr[图] boost scoped_ptr的正确构造 boost shared_ptr[图] boost shared_ptr构建.png[图] boost shared_ptr可以多次引用指针 boost  week ptr[图] boost week_ptr boost intrusive 侵入式指针 boost  make_shared 省略显式的new boost enable_shared_from_this boost 循环引用,对象无法析构,

boost智能指针指定const对象问题

由于非常习惯用const来加强代码的封装性,结果最近遇到了一些问题,顺带研究了一下 以前基本没用过boost的智能指针,后来进了新项目组,引擎里遇到了大量boost的shared_ptr,intrusive_ptr指针,还有weak_ptr.因为遇到过更好用的weak_ptr,所以boost::weak_ptr感觉是个封装不是很好的瘸腿指针(相比起来可能效率高,但是使用起来很麻烦,访问其中的指针变量必须要调用lock()对象,感觉移植性大大减少,而且写起代码来感觉好冗余..原谅我活在一个徒手用指