內(nèi)存管理一直是令C++程序員最頭疼的工作,C++繼承了C那高效而又靈活的指針,使用起來稍微不小心就會導致內(nèi)存泄漏(memory leak)、“野”指針(wild pointer)、訪問越界(accessdenied)等問題。曾幾何時,C++程序員曾經(jīng)無限地向往Java、C#等語言的垃圾回收機制。雖然C++標準提供了智能指針std: :auto_ ptr, 但并沒有解決所有問題。
閱讀完,你會了解到高效的內(nèi)存管理方法,徹底忘記“?!?Stack)、“堆”(Heap)等內(nèi)存分配相關(guān)的術(shù)語,并且還會發(fā)現(xiàn),Boost 為C++提供的解決方案可能要比Java和C#等其他語言更好。
智能指針(smart pointer)是C++群體中熱門的議題,圍繞它有很多有價值的討論和結(jié)論。它實踐了推薦書目[1]中的代理模式,代理了原始“裸”指針的行為,為它添加了更多更有用的特性。
C++引入異常機制后,智能指針由-種技巧升級為一種非常重要的技術(shù),因為如果沒有智能指針,程序員必須保證new對象能在正確的時機delete,四處編寫異常捕獲代碼以釋放資源,而智能指針則可以在退出作用域時一不管是正常流程離開或是因異常離開一總調(diào)用delete來析構(gòu)在堆上動態(tài)分配的對象。
存在很多種智能指針,其中最有名的應該是C++98標準中的“自動指針”std::auto_ ptr,它部分地解決了獲取資源自動釋放的問題,例如:
int main()
{
auto_ ptr< class_ need_ resource >p1 (new class_ need_ resource) ;
auto_ ptrp2 (factory.create()) ;
}//離開作用域,p1、p2自動析構(gòu)從而釋放內(nèi)存等資源
三、智能指針utoptr的構(gòu)造函數(shù)接受new操作符或者對象工廠創(chuàng)建出的對象指針作為參數(shù),從而代理了原始指針。雖然它是- -一個對象,但因為重載了operator*和 opreator->,其行為非常類似指針,可以把它用在大多數(shù)普通指針可用的地方。當退出作用域時(離開函數(shù)main()或者發(fā)生異常),C++語言會保證auto_ ptr對象銷毀,調(diào)用auto_ ptr的析構(gòu)函數(shù),進而使用delete操作符刪除原始指針釋放資源。
auto_ ptr很好用,被包含在C++標準庫中令它在世界范圍內(nèi)被廣泛使用,使智能指針的思想、用法深入人心。但標準庫并沒有覆蓋智能指針的全部領(lǐng)域,尤其是最重要的引用計數(shù)型智能指針。
boost.smart_ ptr 庫是對C++98標準的-一個絕佳補充。它提供了六種智能指針,包括scoped_ ptr、 scoped array shared ptr、shared array, weak_ ptr 和intrusive_ptr,從各個方面來增強std: :auto_ _ptr, 而且是異常安全的。庫中的兩個類一-shared ptr和weak_ ptr 已被收入到C++新標準的TR1庫中。
接下來的部分將詳細介紹scoped ptr、scoped_ array、shared ptr和sharedarray,簡要介紹另兩個組件weak_ ptr和intrusive_ ptr。它們都是很輕量級的對象,速度與原始指針相差無幾,對于所指的類型T也僅有一個很小且很合理的要求:類型T的析構(gòu)函數(shù)不能拋出異常。
這些智能指針都位于名字空間boost,為了使用smart_ _ptr 組件,需要包含頭文件
#include
using namespace boost;
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧