template<class T, class Deleter = std::default_delete<T>> class unique_ptr;
template <class T, class Deleter> class unique_ptr<T[], Deleter>;
std::unique_ptr
是經過指針佔有並管理另外一對象, 並在unique_ptr
離開做用域時釋放該對象的智能指針。算法
釋放對象的時機-> :數組
也能夠經過調用get_deleter()(ptr) 刪除對象;ide
unique_ptr 是能夠轉義對象的管理權的,可是被const修飾以後就不可以被轉移了函數
函數名字 | 做用 |
---|---|
operator= | 賦值 |
reset | 替換被管理對象 |
swap | 交換被管理對象 |
release | 返回被管理對象的指針,而且釋放一個對象全部權 |
get | 返回被管理對象的指針 |
函數名字 | 做用 |
---|---|
make_unique | 建立一個管理對象的獨佔指針 |
std::swap(std::unique_ptr) | 特化 std::swap 算法 |
struct Base { // 建立一個虛函數 virtual void bar() { std::cout << "Base::bar()\n"; } virtual ~Base() = default; std::string val; }; struct Derived : Base { Derived() { std::cout << "Derived::Constructor\n"; } ~Derived() { std::cout << "Derived::Descontructor\n"; } void bar() override { std::cout << "Derived::bar()\n"; } std::string val; }; int main() { std::cout << "\nunique_ptr 指向對象的全部權的測試---->\n"; { // ptr_Derived擁有對象的全部權 auto ptr_Derived = std::make_unique<Derived> (); ptr_Derived->val = "unique_ptr"; auto ptr_MoveD = std::move(ptr_Derived); //ptr_Derived 不在擁有對象全部權 assert(!ptr_Derived); //ptr_Derived爲empty ptr_MoveD->bar(); std::cout << ptr_MoveD->val << std::endl; // 這裏將會調用一次Derived的析構函數 } std::cout << "\n多態運行時測試----->\n"; { std::unique_ptr<Base> p_base = std::make_unique<Derived>(); // p_base是指向基類的指針,可是佔有D的unique_ptr p_base->bar(); // 這裏將調用的Derived的bar函數 std::vector<std::unique_ptr<Base>> v; // 容器也能夠存儲unique_ptr對象 v.push_back(std::move(p_base)); v.push_back(std::make_unique<Derived>()); v.emplace_back(new Derived); for (auto& itr : v) { itr->bar(); } // 這裏將調用3次析構函數 } std::cout << "\n數組形式的unique_str對象測試--->\n"; { std::unique_ptr<Derived[]> parr{ new Derived[4] }; // 這裏將調用4次析構函數 } return 0; }
unique_ptr 指向對象的全部權的測試----> Derived::Constructor Derived::bar() unique_ptr Derived::Descontructor 多態運行時測試-----> Derived::Constructor Derived::bar() Derived::Constructor Derived::Constructor Derived::bar() Derived::bar() Derived::bar() Derived::Descontructor Derived::Descontructor Derived::Descontructor 數組形式的unique_str對象測試---> Derived::Constructor Derived::Constructor Derived::Constructor Derived::Constructor Derived::Descontructor Derived::Descontructor Derived::Descontructor Derived::Descontructor