Memory (C++標準庫)

memory 是C++標準程式庫中的一個標頭檔案，定義了C++標準中的智慧指標、記憶體分配器物件的函式等等。智慧指標.智慧指標是指當指標物件的生命期結束析構時，同時把指標所指的物件也delete或者引用計數減1。unique_ptr.unique_ptr是個類模板。unique_ptr指標物件獨佔式地引用所指的資料物件。不能複製構造delete所指向的資料物件。unique_ptr十分依賴於右值引用和移動語義。templateclass unique_ptr {public:typedef Type element_type; //指標基型別typedef Del deleter_type; //析構型別typedef T1 pointer; //指標型別 為Del::pointer，否則為Type *//建構函式unique_ptr (); //11 空指標unique_ptr (nullptr_t _Nptr); //22 空指標explicit unique_ptr (pointer _Ptr); //33unique_ptr (pointer _Ptr, typename conditional::type _Deleter); //44unique_ptr (pointer _Ptr,typename remove_reference::type&amp;&amp; _Deleter); //55unique_ptr (unique_ptr&amp;&amp; _Right); //66template&amp;&amp; _Right); //77//解構函式~unique_ptr ();unique_ptr&amp; operator= (unique_ptr&amp;&amp; _Right); //右值賦值template&amp;&amp; _Right);//右值賦值void swap (unique_ptr&amp; _Right); //交換兩個unique_ptr物件的內容pointer release (); //在stored_ptr中儲存pointer的新的值，並返回前一個值，用於放棄對所指資料物件的獨佔void reset (pointer _Ptr = pointer() ); //delete當前擁有的資源並接受新的資源pointer get () const; //返回stored_ptrType&amp; operator* () const; //返回*stored_ptrpointer operator-&gt; () const; //返回stored_ptrDel&amp; get_deleter (); //返回stored_deleter的引用const Del&amp; get_deleter () const; //返回stored_deleterexplicit operator bool () const; //get() != pointer() 的值unique_ptr(const unique_ptr&amp; _Right) = delete;unique_ptr&amp; operator=(const unique_ptr&amp; _Right) = delete;private:pointer stored_ptr; // exposition onlyDel stored_deleter; // exposition onlyunique_ptr的主要用途有：shared_ptr.shared_ptr是一個類模板，包裝了使用引用計數的智慧指標。當shared_ptr在退出其作用域、生命期結束時，解構函式或自動對所指記憶體資料物件的引用計數減去1。如果記憶體資料物件的引用計數為0，則會被自動delete。指向同一資源的shared_ptr共同擁有一個控制塊，其中儲存了shared_ptr的引用計數、指向這一資源的weak_ptr的數目、資源的析構器地址、對該控制塊的可定製的allocator。templateclass shared_ptr {public:typedef Ty element_type; //指標基型別//建構函式shared_ptr(); //11 空指標shared_ptr(nullptr_t); //22 空指標shared_ptr(const shared_ptr&amp; sp); //33 複製構造shared_ptr(shared_ptr&amp;&amp; sp); //44 右值移動構造template explicit shared_ptr(Other * ptr); //55 由其他指標初始化，構造失敗時自動呼叫delete ptrtemplate shared_ptr(Other * ptr, D dtor); //66 由其他指標初始化，dtor是個可呼叫的函式物件，構造失敗時自動呼叫dtor(ptr)template shared_ptr(nullptr_t, D dtor); //77 空指標，並指定deletertemplate shared_ptr(Other *ptr, D dtor, A alloc);//88 alloc管理shared_ptr控制塊的記憶體分配與釋放，構造失敗時自動呼叫dtor(ptr)template shared_ptr(nullptr_t, D dtor, A alloc);//99 空指標template&amp; sp); //0A 複製構造+型別轉換template&amp;&amp; sp); //0B 移動構造+型別轉換template&amp; wp); //0C 由弱指標複製構造template&amp; ap); //0D 由auto_ptr指標複製構造template&amp;&amp; up); //0E 由unique_ptr移動構造template&amp; sp, Ty *ptr); //0Ftemplate&amp; up) = delete;//10 禁用const unique_ptr作為移動建構函式~shared_ptr(); // 解構函式shared_ptr&amp; operator=(const shared_ptr&amp; sp); //賦值運算子template&amp; sp); //型別轉換的賦值運算子shared_ptr&amp; operator=(shared_ptr&amp;&amp; sp); //右值引用的移動語義template&amp;&amp; sp); //右值引用+型別轉換template&amp;&amp; ap); //右值引用+auto_ptr型別轉換template &amp; up) = delete; //禁止const型unique_ptr移動賦值給shared_ptrtemplate &amp;&amp; up);//右值引用的移動語義+型別轉換void swap(shared_ptr&amp; sp); //交換兩個指標的內容//reset成員函式，把當前指向的資料物件的引用計數減1，然後指向引數表中新的資料物件void reset();template void reset(Other *ptr);template void reset(Other *ptr, D dtor);template void reset(Other *ptr, D dtor, A alloc);Ty *get() const; //返回所指向的資料物件的地址Ty&amp; operator*() const; //返回所指向的資料物件Ty *operator-&gt;() const; //返回所指向的資料物件的地址long use_count() const; //返回引用計數值bool unique() const; //判斷是否獨佔引用資料物件operator bool() const; //判斷是否指向了一個數據物件template const&amp; ptr) const;template const&amp; ptr) const;template const&amp; ptr);weak_ptr.弱指標weak_ptr用於指向、但不擁有，該資源將被delete，這時如果仍然有弱指標指向該資源，則該弱指標將變為expired狀態。這實際上避免了資源的迴圈引用計數。對於迴圈的引用計數，如果把其中的一個shared_ptr的指標指向改為weak_ptr的指標指向，即打破了迴圈引用。template class weak_ptr {public:typedef Ty element_type; //指標基型別//建構函式weak_ptr(); //空指標weak_ptr(const weak_ptr&amp;); //複製構造template&amp;); //型別轉換的複製構造template&amp;); //從shared_ptr複製構造//賦值運算子weak_ptr&amp; operator=(const weak_ptr&amp;);template&amp;);template&amp;);void swap(weak_ptr&amp;); //交換物件的內容void reset(); //放棄指向資源，當前物件變為空的弱指標long use_count() const; //返回資源的引用計數bool expired() const; //判斷指向的資源是否還存在shared_ptr lock() const; // 獲取對資源的專屬擁有auto_ptr.auto_ptr，即自動指標，在C++11標準是過時的類模板。其他Helper類.default_delete.作為使用codice_1分配記憶體的unique_ptr物件的deleter。有兩種形式：示例：int main()// {// std::shared_ptr shared_bad(new int[10]);// } // the destructor calls delete, undefined behavior{std::shared_ptr} // the destructor calls delete[], ok{std::unique_ptr ptr(new int(5));} // unique_ptr{std::unique_ptr ptr(new int[10]);} // unique_ptr// default_delete can be used anywhere a delete functor is neededstd::vector v;for(int n = 0; n ReferTestB(ptr_a);std::cout « "1 ref a:" « ptr_a.use_count() « std::endl;std::cout « "1 ref b:" « ptr_a.use_count() « std::endl;return 0;獨佔指標的例子.int main()std::unique_ptr pInt;pInt.reset(new int());int *p = pInt.release(); //釋放所有權//由於unique_ptr有std::unique_ptr的過載函式，所以它可以用來管理陣列資源std::unique_ptr pArray(new int[3]{1,3,3});