智慧型指標是行為類似於指標的類物件,使用智慧型指標可幫助管理動態分配的記憶體與使用new建立的物件。
c++中提供的智慧型指標模板有auto_ptr、unique_ptr、shared_ptr和weak_ptr。可以將new獲得的位址賦給智慧型指標物件。當智慧型指標過期時,其析構函式將使用delete來釋放記憶體。因此,如果將new返回的位址賦給智慧型指標物件,將無需記住稍後釋放這些記憶體,當智慧型指標過期時,這些記憶體會自動被釋放。智慧型指標物件的很多方面都類似於常規指標,例如,可以對它執行解除引用操作(*p)、訪問結構成員(p->data)、將它賦給相同型別的智慧型指標。但是將智慧型指標物件賦值個另乙個智慧型指標物件,將引發一些問題。
要建立智慧型指標物件,必須包含標頭檔案memory。例如,模板auto_ptr包含如下建構函式
templateclass auto_ptr;
1,使用智慧型指標來管理動態分配的記憶體
下面是使用智慧型指標的例子
auto_ptr
pint(new
int);
下面是不使用智慧型指標的例子
int *p = new int;
...delete p;
上面的指標變數p是乙個普通的指標,當p的生命週期結束時,指標p分配的記憶體會被釋放,但是p指向的記憶體空間不會被釋放,因此,要手動呼叫delete,釋放掉動態分配的記憶體空間。但pint是乙個智慧型指標,它是乙個物件,當它的生命週期結束時,會呼叫它的析構函式,在析構函式中會釋放掉動態分配的記憶體。2,使用智慧型指標來管理用new建立的物件
class resource
輸出結果
object
created.
object
delete.
object
created.
object
delete.
object
created.
object
delete.
process returned 0 (0x0) execution time : 0.039 spress any key to continue.
注意:
智慧型指標不能用來管理非堆記憶體,例如:
resource res;
auto_ptr p1(res);
p1過期時,程式將把delete運算子用於非堆記憶體,這是錯誤的。(1),智慧型指標賦值帶來的問題
auto_ptr
p1(new resource);
auto_ptr
p2;p2 = p1;
如果p1與p2是常規指標,則兩個指標將指向同乙個resource物件。但是對於智慧型指標來說這是不能接受的,因為程式將試圖刪除同乙個物件兩次,一次是p1過期時,另一次是p2過期時。要避免這種問題,方法有多種:(2),錯誤使用auto_ptr帶來的問題
auto_ptr
p1(new
string("hello world."));
auto_ptr
p2;
p2 = p1;
cout
<<*p2<<*p1《上面的程式在執行時會出錯,出錯的原因是,賦值語句p2 = p1將所有權從p1轉到p2,這導致p1不再引用該字串。在auto_ptr型別的指標放棄物件的所有權之後,便可能使用它來訪問該物件,卻發現這個智慧型指標是空的,所以會導致上面的問題。unique_ptr與auto_ptr都是採用所有權模型,如果用unique_ptr代替auto_ptr也會出錯。但使用unique_ptr時,程式不會等到執行期崩潰,而在編譯器發現賦值操作p2 = p1,將報錯。
(3),使用shared_ptr代替auto_ptr解決上面的問題
shared_ptr
p1(new
string("hello world."));
shared_ptr
p2;
p2 = p1;
cout
<<*p2<<*p1《上面的程式正常執行,這次p1與p2指向同乙個物件,物件的引用計數由1增加到2。在程式末尾,p2的生命週期結束時,會呼叫它的析構函式,此時物件的引用計數降低為1。然後p1的生命週期結束,會呼叫它的析構函式,此時物件的引用計數降低為0,釋放掉為物件分配的記憶體空間。
第十六章 tcp wrappers
在伺服器向外提供的tcp服務上包裝一層安全檢測機制。外來連線請求首先通過這個安全檢測,獲得安全認證後才可被系統服務接受。hosts.allow hosts.deny 在配置檔案中為各服務分別定義訪問控制規則實現訪問控制,檔案中的規則是即時生效的。配置檔案語法 1 daemon list client...
第十六章 複雜的抽像類結構
7 複雜的抽像結構 有的時候我們發現乙個抽像類不能靈活地解決複雜的問題,比如說我們有個基類 動物,它有6個純虛函式,睡覺sleep 吃eat 繁殖propagate 運動move 顯示年齡show 和說話speak 我們在哺乳動特類和鳥類便是從這個基類 動物類中派生出來,但是這裡有乙個問題,就是鳥類...
C和指標 第十六章 標準函式庫
字串轉換 long int strtol char const string,char unused,int base 將字串轉換為數值形式,遇到非法字元停止,如果stop不是null,則將轉換停止位置儲存在stop中。include include int main 執行 clock t cloc...