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