[記憶體管理]智慧指標之shared_array
轉自:http://blog.csdn.net/ajioy/article/details/7376987
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);
- };
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
- }
#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>代替。
這兩個方案具有更高的靈活性和更好的安全性,所付出的代價幾乎可以忽略不計。
相關文章
- c++動態記憶體管理與智慧指標C++記憶體指標
- C指標與記憶體指標記憶體
- Delphi 記憶體與指標記憶體指標
- C++中的動態記憶體與智慧指標C++記憶體指標
- 記憶體管理兩部曲之實體記憶體管理記憶體
- 智慧指標的模板,用來管理動態分配的記憶體指標記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- 從幾個指標談windows記憶體指標Windows記憶體
- 衡量記憶體閒忙程度的指標記憶體指標
- C++ 指標動態記憶體分配C++指標記憶體
- 指標:存放記憶體地址的變數指標記憶體變數
- c語言野指標與結構體指標動態記憶體分配小解C語言指標結構體記憶體
- 記憶體管理 記憶體管理概述記憶體
- Android 之 記憶體管理Android記憶體
- 記憶體管理之五 (轉)記憶體
- c++動態記憶體智慧指標及weak_ptr用法的理解C++記憶體指標
- C語言重點——指標篇(一文讓你完全搞懂指標)| 從記憶體理解指標 | 指標完全解析C語言指標記憶體
- C 語言中的指標和記憶體洩漏指標記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- 溫故之.NET記憶體管理記憶體
- ORACLE 記憶體管理 之四 SGAOracle記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- JVM讀書筆記之記憶體管理JVM筆記記憶體
- 【記憶體管理】記憶體佈局記憶體
- Oracle記憶體中的幾個重要監控指標Oracle記憶體指標
- 學了指標沒學動態記憶體一切都白搭!C語言基礎教程之記憶體管理指標記憶體C語言
- 什麼是資料指標管理,如何建立指標管理體系指標
- Java的記憶體管理機制之記憶體區域劃分Java記憶體
- OCP課程54:管理II之管理記憶體記憶體
- 深入理解JVM之記憶體管理JVM記憶體
- 記憶體管理記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- Aerospike的bin記憶體管理--即列記憶體管理ROS記憶體
- Go指標探秘:深入理解記憶體與安全性Go指標記憶體
- AntDB記憶體管理之記憶體上下文之記憶體上下文機制是怎麼實現的記憶體
- C語言第九周作業(指標變數,記憶體訪問,取址,空指標)C語言指標變數記憶體
- 【記憶體管理】Oracle AMM自動記憶體管理詳解記憶體Oracle