boost-智能指针

原创 2013年12月03日 11:26:11

boost中智能指针主要包括scoped_ptr,scoped_array,shared_ptr,shared_array;

1.scoped_ptr

scoped_ptr:跟auto_ptr很像,但是它有更严格的管理权也更安全。当离开作用域能够自动释放的指针。因为它是不传递所有权的。事实上它

明确禁止任何想要这样做的企图!这在你需要确保指针任何时候只有一个拥有者时的任何一种情境下都是非常重要的。

头文件:#include <boost/scoped_ptr.hpp>using namespace boost;
函数接口定义:

namespace boost {

  template<class T> class scoped_ptr : noncopyable {

   public:
     typedef T element_type;

     explicit scoped_ptr(T * p = 0); // never throws
     ~scoped_ptr(); // never throws

     void reset(T * p = 0); // never throws

     T & operator*() const; // never throws
     T * operator->() const; // never throws
     T * get() const; // never throws
     
     operator unspecified-bool-type() const; // never throws

     void swap(scoped_ptr & b); // never throws
  };

  template<class T> void swap(scoped_ptr<T> & a, scoped_ptr<T> & b); // never throws

}

用法介绍:

#include <iostream>
#include <boost/intrusive_ptr.hpp>

using namespace boost;
using std::cout;
using std::endl;

int main() 
{
    scoped_ptr<string> sp(new string("test"));
    cout<<*sp<<endl;//获取string的值。 test
    cout<<sp->size()<<endl;//不需要使用delete操作。不允许拷贝构造和自增操作。
    sp.reset();//将sp置为0;当为0时自动删除。调用string的析构函数。
    int *a = sp.get();//可以得到原始指针。不推荐这么做。
}
意义:代码清晰,错误更少,没有多余的操作,同时效率很高,能够跟原始指针同样的速度。

2.shared_ptr

shared_ptr实现了引用计数型的智能指针,可以被自由拷贝和赋值,任意地方共享他,只有当计数为0时,才能删除它。

它更像一个智能指针,同时也是smart_ptr库中左右价值的、最重要,用的最多的一个组件。

boost::shared_ptr的管理机制其实并不复杂,就是对所管理的对象进行了引用计数,当新增一个boost::shared_ptr对该对象进行管理时

,就将该对象的引用计数加一;减少一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数减一,

如果该对象的引用计数为0的时候,说明没有任何指针对其管理,才调用delete释放其所占的内存。

位置:#include <boost/shared_ptr.hpp>using namespace boost; 

ps:这些智能指针都包含在:#include <boost/smart_ptr.hpp> 头文件中。

类的部分常用接口定义:

完整文档在这:http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm

template<class T> class shared_ptr {
	public:
		 shared_ptr(); // never throws
     		 shared_ptr(std::nullptr_t); // never throws
		~shared_ptr(); // never throws
		
		void reset();

		 T & operator*() const; // never throws; only valid when T is not an array type
     		 T * operator->() const; // never throws; only valid when T is not an array type
		 T * get() const;//获取原始指针。
		
		bool unique() const;//返回是否是唯一拥有者。
		long use_count() const;//返回当前引用计数。
		
}
用法示例:

#include <iostream>
#include <boost/smart_ptr.hpp>

using namespace boost;
using std::cout;
using std::endl;
using std::string;

class demo
{
public:
    ~demo() { std::cout <<"destroying demo\n"; }
    void do_something() { std::cout << "did something\n"; }
};

int main() 
{
    boost::shared_ptr<demo> sp1(new demo());//新建shared指针管理demo对象。
    std::cout<<"Now has "<<sp1.use_count()<<" references\n";

    boost::shared_ptr<demo> sp2 = sp1;
    std::cout<<"Now has "<<sp2.use_count()<<" references\n";
    
    sp1.reset();//sp1解除shared对sp1的指针管理。
    std::cout<<"After Reset has "<<sp2.use_count()<<" references\n";

    sp2.reset();
    std::cout<<"After Reset sp2.\n";
}

/*输出:
    Now has 1 references
    Now has 2 references
    After Reset has 1 references
    destroying demo
    After Reset sp2.
*/




精通C语言指针

指针被誉为C语言的精髓、C本质上是加了一层语法糖的汇编,引进当时先进的函数,保留了汇编强大的地址直接访问功能 —— 指针,使其高效灵活。本课程是黄强老师对于指针的一次专题讲解,相信能给大家带来收获!
  • 2017年09月06日 19:22

智能指针最全资料-5篇经典讲义

  • 2011年09月05日 22:36
  • 300KB
  • 下载

智能指针的作用与原理

对于C/C++程序员来说,指针是天堂,同时指针也是地狱。指针有多少好处,又有多少让人头疼的问题我们这里就不多说了。但为了局部解决指针的问题,我们提出了智能指针这个概念。   实际上,我一直不明白,...
  • chen825919148
  • chen825919148
  • 2012-11-06 22:32:00
  • 3338

stl智能指针和boost智能指针对比

先说说stl中的智能指针auto_ptr,先说说auto_ptr的特点。std::auto_ptr用来管理单个堆内存对象,但是独享所有权,且不允许赋值和拷贝(没有重载operator=),所以如果在函...
  • zhangqi_gsts
  • zhangqi_gsts
  • 2015-12-14 20:15:01
  • 1404

智能指针的简单实现及两种误用方式

最近在自己写智能指针的时候,遇到了一些小的疑惑,也纠正了之前的一些理解上的偏差。 首先是最简单的智能指针的一个实现: template class SmartPointer{ private: T*...
  • a3137732
  • a3137732
  • 2016-04-24 11:44:36
  • 768

C++智能指针与类继承多态

我在做编译器项目的时候, 我们采用c++语言,但要使用多态的性质,一是用引用,二是用指针。可是引用不够灵活,指针还具有内存管理问题。所以SmartPtr是一个必然的选择,可我发现通常的SmartPtr...
  • jiangzw625
  • jiangzw625
  • 2008-03-01 09:33:00
  • 2322

模板和智能指针(c++)

  • 2011年07月24日 22:55
  • 500KB
  • 下载

大型项目开发:谨慎使用智能指针

智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点: 1.性能问题。因为需要引入一些变量(bookkeeping)...
  • HorkyChen
  • HorkyChen
  • 2015-07-13 00:30:37
  • 3819

c++学习笔记—动态内存与智能指针浅析

我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁。 栈内存用来保存定义在函数内部的非st...
  • xujian_2014
  • xujian_2014
  • 2015-01-08 15:45:18
  • 817

【C++】Vs2008中使用智能指针

Tr1模块是C++11正式诞生前夕,已经确定加入新标准的C++特性。Vs2008算是C++11标准正式诞生前夕,对C++03和tr1标准支持的最好的一个IDE,是相当经典的一版,很多程序的开发和维护都...
  • lpsl1882
  • lpsl1882
  • 2016-04-15 16:07:16
  • 1422
收藏助手
不良信息举报
您举报文章:boost-智能指针
举报原因:
原因补充:

(最多只允许输入30个字)