在c++中,動態內存管理是通過new/delete 運算符來進行的。由於確保在正確的時間釋放內存是很困難的,為了避免內存泄漏,更加容易,安全地使用動態內存,C++11標准庫提供了兩種智能指針類型來管理動態對象。只能指針的行為類似於常規指針,重要的區別是它負責自動釋放所指的對象。
std::shared_ptr , 允許多個指針指向同一個對象
std::unique_ptr, 獨占所指向的對象
std::unique_ptr 是 c++11中用來取代 std::auto_ptr 指針的指針容器。 它不能與其他unique_ptr類型的指針對象共享所指對象的內存。這種所有權僅能夠通過std::move函數來轉移。unique_ptr是一個刪除了拷貝構造函數、保留了移動構造函數的指針封裝類型。
調用release 會切斷unique_ptr 和它原來管理的對象的聯系。release 返回的指針通常被用來初始化另一個智能指針或給另一個智能指針賦值。如果不用另一個智能指針來保存release返回的指針,程序就要負責資源的釋放。
#include <iostream> #include <memory> int main() { std::unique_ptr<int> uptr(new int(10)); //綁定動態對象 //std::unique_ptr<int> uptr2 = uptr; //不能賦值 //std::unique_ptr<int> uptr2(uptr); //不能拷內 std::unique_ptr<int> uptr2 = std::move(uptr); //轉換所有權 if(uptr == nullptr) printf("uptr give up *int\n"); int * p = uptr2.release(); //uptr2釋放對指針的控制權,返回指針,並將uptr2置為空 if(uptr2 == nullptr) printf("uptr2 give up *int\n"); printf("%d\n", *p); delete p; return 0; }
輸出結果:
[daq@centos build]$ ./hello-exe/cmake-good uptr give up *int uptr2 give up *int 10