[内存管理]智能指针之shared_array

原创 2012年03月21日 10:59:53

shared_array类似shared_ptr,它包装了new[]操作符在堆上分配的动态数组,同样使用引用计数机制为动态数组提供了一个代理,可以在程序的生命同期里长期存在,直到没有任何引用后才释放内存。

类摘要:

template<class T> class shared_array{

public:
     explicit shared_array(T *p = 0);
	 template<class D> shared_array(T *p,D d);
	 ~shared_array();
	 
	 shared_array(shared_array const & r);
	 shared_array &operator=(shared_array const &r);
	 
	 void reset(T *p = 0);
	 template<class D> void reset(T *p, D d);
	 
	 T & operator[](std::ptrdiff_t i) const() const;
	 T *get() const;
	 
	 bool unique() const;
	 long use_count() const;
	 
	 void swap(shared_array<T> & b);
};

shared_array与shared_ptr的区别如下:

1:构造函数接受的指针p必须是new[]的结果,而不能是new表达式。

2:提供operator[]操作符重载,可以像普通数组一样用下标访问元素。

3:没有*、->操作符重载,因为shared_array持有的不是一个普通指针。

4:析构函数使用delete[]释放资源,而不是delete。

 

使用示例:

#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace boost;
using namespace std;
int main(){
     //shared_array<int> sp(new int[100]);	
     //a dynamic array
     int *p = new int[100];
     //shared_array agent dynamic array
     shared_array<int> sa(p);
     //shared array,add reference count
     shared_array<int> sa2 = sa;
     sa[0] = 10;
     assert(sa2[0] == 10);
     cout << "use count:" << sa.use_count() << endl;
     cout << "No Problem..." << endl;
     //out of scope,remove dynamic array automatically
}


运行结果:

use count:2
No Problem...

shared_array是shared_ptr和scoped_array的结合体,既具有shared_ptr的优点,也有scoped_array的缺点。

在使用shared_array重载的operator[]要注意,shared_array不提供数组索引的范围检查,如果超过了动态数组大小的索引或者是负数索引将引发未定义行为。

shared_array能力有限,大多情况下可以用shared_ptr<std::vector>或者std::vector<shared_ptr>代替。

这两个方案具有更高的灵活性和更好的安全性,所付出的代价几乎可以忽略不计。

版权声明:转载时请标注来自于"AJIOY的专栏"

C++智能指针shared_array

boost C++ library的配置,C++智能指针数组boost::shared_array简单测试
  • chaojiwudixiaofeixia
  • chaojiwudixiaofeixia
  • 2015年10月26日 08:12
  • 5940

Boost:使用shared_array和shared_ptr

转自:http://hi.baidu.com/ae8506/item/7279e8cf8eb17020a1b50a55 作者:CYM 和scoped_array和scoped_ptr相比,shar...
  • penaiyan
  • penaiyan
  • 2013年06月03日 11:12
  • 1155

boost库在工作(10)引用计数的智能指针shared_array

在共享指针里,有时也需要共享一个缓冲区,比如从网络收到数据,需要先放到缓冲区里,接着把这些数据发送给处理线程进行解包和处理。在这里就需要使用到两个线程里共享缓冲区的问题,因此比较好的解决方案,就采用引...
  • superbfly
  • superbfly
  • 2013年07月17日 11:23
  • 1228

C++11中使用shared_ptr和unique_ptr管理动态数组

在C++11中,若使用shared_ptr管理一个动态数组,则需手动制定一个删除器。 auto sp = std::shared_ptr(new int[len], [](char *p){delet...
  • wks19891215
  • wks19891215
  • 2016年03月27日 16:13
  • 4968

关于shared_ptr 的一些探索

很多年没有做过C++项目了,最近买了中文版的STL 标准模板库第二版,准备花些时间了解一下C++11的最新内容。完整的阅读了Smart Pointer 的内容之后,想写几个例子熟悉一下Shared_p...
  • sad_4978
  • sad_4978
  • 2016年07月01日 22:13
  • 1177

c++11 条款21:尽量使用std::make_unique和std::make_shared而不直接使用new

Item 21:Prefer std::make_unique and std::make_shared to direct use of new. 条款21:倾向于使用std::make_uniqu...
  • coolmeme
  • coolmeme
  • 2015年02月03日 17:14
  • 28145

boost学习之-shared_array

用法:   1 用于共享数组所有权的智能指针   2 用于数组而不是单个对象   3 std::vector的shared_ptr提供了比shared_array更多的灵活性 综上,个...
  • sohu_2011
  • sohu_2011
  • 2012年07月07日 19:18
  • 1740

C++智能指针 shared_array

shared_array shared_array类似shared_ptr,它包装了new[]操作符在堆上分配的动态数组,同样使用引用计数机制为动态数组提供了一个代理,可以在程序的生命周期里长期存在...
  • u011676589
  • u011676589
  • 2013年08月30日 16:47
  • 1111

C++ 学习笔记(12)动态内存、智能指针、new和delete、动态数组、allocator

C++ 学习笔记(12)动态内存、智能指针、new和delete、动态数组、allocator 参考书籍:《C++ Primer 5th》 API:动态内存管理静态内存: 保存局部stat...
  • l773575310
  • l773575310
  • 2018年02月06日 01:56
  • 72

Boost 共享指针 共享数组

共享指针 shared_ptr已经作为技术报告1(TR1)的一部分被添加到标准。如果开发环境允许,可以使用memory中定义的std::shared_ptr。 在Boost C++库里,类...
  • PeterPan_hai
  • PeterPan_hai
  • 2016年06月21日 14:10
  • 1220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[内存管理]智能指针之shared_array
举报原因:
原因补充:

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