眾所周知,c++中最讓程式設計師頭疼的就是關於記憶體的問題,其中不外乎以下幾點:
1. 緩衝區溢位
2. 野指標
3. 重複釋放記憶體
4. 不配對的new/delete
5. 記憶體洩露
其中大多數的問題都是對指標的不正確使用帶來的。為此c++標準庫中對原始指標做了一些封裝,比如auto_ptr,使得指標更容易使用,但是還是存在眾多不足。而在boost庫中,對原始指標做了更多的封裝,彌補了auto_ptr的不足,所以下面介紹的是boost庫中的幾個智慧型指標。
定義:類似於auto_ptr的智慧型指標,它包裝了new操作符在堆上分配的動態物件,能夠保證動態建立的物件在任何時候都可以被正確地刪除,只能在被宣告的作用域內使用。
用法:
#include
using
namespace boost;
scoped_ptr sp(new
string("text"));
與auto_ptr的區別:scoped_ptr的所有權更加嚴格,一旦scoped_ptr獲取了物件的管理權就不能轉讓出去了(因為拷貝建構函式和賦值操作符都被宣告為私有)。而auto_ptr的所有權可以轉讓,比如:
auto_ptr
ap(new
string("test");
scoped_ptr sp1(ap); // ap已經把所有權讓給sp1了。
scoped_ptr sp2 = sp1; // 編譯錯誤,sp1的所有權不能轉讓。
定義:類似於scoped_ptr,但它包裝了new操作符在堆上分配的動態陣列,為動態陣列提供了乙個**,保證可以正確地釋放記憶體。它也不能拷貝、賦值。只能在被宣告的作用域內使用。
用法:
#include
using
namespace boost;
scoped_array sa(new
int[100]);
不足:
1. scoped_array過載了操作符,所有可以像陣列一樣用獲取索引處的值,但是它並沒有提供陣列範圍的檢查,超出索引會引發未定義的行為發生。
2. 不能動態增長,也沒有迭代器支援,不能搭配stl演算法。
建議:要使用陣列語意時,不推薦用scoped_array,而應該用vector,它支援動態增長,且有豐富的成員函式來操縱資料。
定義:shared_ptr是乙個最像指標的「智慧型指標」,它和scoped_ptr一樣,包裝了new操作符在堆上分配的動態物件,但它實現的是引用計數型的智慧型指標,可以被自由的拷貝和賦值,在任意的地方共享它。
用法:
#include
using
namespace boost;
shared_ptr
sp(new
int(10));
另類用法:
1. 工廠函式,不需要呼叫new關鍵字
#include
shared_ptrsp = make_shared("make_shared");
shared_ptrspv = make_shared>(10,2);
2. 定製刪除器
shared_ptr(y *p, d d)用於在析構時呼叫d方法來操作p指標,即呼叫d(p)。比如,在釋放套接字時候,呼叫關閉套將字的方法:shared_ptr(socket,close);
3. 其他一切用到指標的設計模式
定義:類似於shared_ptr,但包裝了new操作符,同樣使用了引用計數。
用法:
int *p = new
int[100];
shared_array sa1(p);
shared_array sa2 = sa1;
注意:shared_array過載的不提供陣列索引的範圍檢查。建議使用shared_ptr或std::vector。
定義:為了配合shared_ptr而引入的一種智慧型指標,它更像乙個助手,它不具備普通指標的行為它的最大作用在於協助shared_ptr工作。它沒有過載operator*和->,這是特意的,因為它不共享指標,不能操作資源。
用法:
shared_ptr
sp(new
int(10));
weak_ptr wp(sp);
if ( !wp.expired() ) // 判斷wp觀察的物件是否失效
C 智慧型指標學習筆記
原文 摘錄智慧型指標 auto ptr,unique ptr,shared ptr,weak ptr 智慧型指標的作用是管理乙個指標,因為存在一下的情況 申請的空間再函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標是乙個類,當超出了類的例項物件的作用域時...
學習筆記之智慧型指標shared ptr
智慧型指標都定義在 memory 標頭檔案中 程式使用的三種記憶體 靜態記憶體 存放 區域性,全域性static變數,以及全域性變數 棧記憶體 存放 區域性非static變數,函式內部變數 堆記憶體 自由空間 動態分配的物件 記憶體池 shared ptr 允許多個指標指向同乙個物件 shared ...
C 之智慧型指標
本文發表於1999年10月份的c c users journal,17 10 1.為什麼稱它為 自動 指標?auto ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的 服務。可以把標準c auto ptr看作智慧型指標的ford...