[記憶體管理]智慧指標之shared_array

pamxy發表於2013-06-03

轉自:http://blog.csdn.net/ajioy/article/details/7376987

shared_array類似shared_ptr,它包裝了new[]操作符在堆上分配的動態陣列,同樣使用引用計數機制為動態陣列提供了一個代理,可以在程式的生命同期里長期存在,直到沒有任何引用後才釋放記憶體。

類摘要:

  1. template<class T> class shared_array{  
  2.   
  3. public:  
  4.      explicit shared_array(T *p = 0);  
  5.      template<class D> shared_array(T *p,D d);  
  6.      ~shared_array();  
  7.        
  8.      shared_array(shared_array const & r);  
  9.      shared_array &operator=(shared_array const &r);  
  10.        
  11.      void reset(T *p = 0);  
  12.      template<class D> void reset(T *p, D d);  
  13.        
  14.      T & operator[](std::ptrdiff_t i) const() const;  
  15.      T *get() const;  
  16.        
  17.      bool unique() const;  
  18.      long use_count() const;  
  19.        
  20.      void swap(shared_array<T> & b);  
  21. };  
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。

 

使用示例:

  1. #include <iostream>   
  2. #include <boost/smart_ptr.hpp>   
  3. using namespace boost;  
  4. using namespace std;  
  5. int main(){  
  6.      //shared_array<int> sp(new int[100]);       
  7.      //a dynamic array   
  8.      int *p = new int[100];  
  9.      //shared_array agent dynamic array   
  10.      shared_array<int> sa(p);  
  11.      //shared array,add reference count   
  12.      shared_array<int> sa2 = sa;  
  13.      sa[0] = 10;  
  14.      assert(sa2[0] == 10);  
  15.      cout << "use count:" << sa.use_count() << endl;  
  16.      cout << "No Problem..." << endl;  
  17.      //out of scope,remove dynamic array automatically   
  18. }  
#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>代替。

這兩個方案具有更高的靈活性和更好的安全性,所付出的代價幾乎可以忽略不計。

 

相關文章