[Boost基礎]記憶體管理——智能指標(一)

來源:互聯網
上載者:User
記憶體管理

記憶體管理一直是令C++程式員最頭疼的工作,C++繼承了C的那種高效而又靈活的指標,使用起來稍微不小心就會導致記憶體泄露,“野”指標,訪問越界等問題。曾幾何時,C++程式員曾經無限的嚮往Java,C#等語言的記憶體回收機制。雖然C++標準提供了智能指標std::auto_ptr,但並沒有解決所有問題。

電腦系統中資源有很多種,記憶體是我們最常用到的,此外還有檔案描述符,socket,作業系統handle,資料庫連接等等,程式中申請這些資源後必須及時歸還系統,否則就會產生難以預料的後果。

智能指標

智能指標的原理基於一個常見的習語叫做RAII:資源申請即初始化。智能指標只是這個習語的其中一例——當然是相當重要的一例。智能指標確保在任何情況下,動態分配的記憶體都能得到正確釋放,從而將開放人員從這項任務重解放了出來。這包括程式因為異常而中斷,原本用於釋放記憶體的代碼被跳過的情境。用一個動態分配的對象地址來初始化智能指標,在析構的時候釋放記憶體,就確保了這一點。因為解構函式總是會被執行的,這樣所包含的記憶體也將總是會被釋放。

1998年修訂的第一版C++標準只提供了一種智能指標:std::auto_ptr。它基本上就像是個普通的指標:通過地址來訪問一個動態分配的對象。std::auto_ptr之所以被看作是智能指標,是因為它會在析構的時候調用delete操作符來自動釋放所包含的對象。當然這要求在初始化得時候,傳給它一個由new操作符返回的對象的地址。既然std::auto_ptr的解構函式會調用delete操作符,它所包含的對象的記憶體會確保釋放掉。這是智能指標的一個優點。

執行個體
#include <stdio.h>#include <stdlib.h>//定義一個支援各種指標類型的模板template <typename T>class MemHandler{private: T* _t;public:MemHandler():_t(NULL){}MemHandler(T* t):_t(t){}~MemHandler(){if (_t!=NULL) delete _t;}};class Test{public:Test(){printf("Test construct\n");}~Test(){printf("~ test destroyed\n");}};void main(){MemHandler<int>handle1(new int);MemHandler<Test> handle2(new Test);}

輸出結果:

Test construct~ test destroyed

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.