日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

深入学习c++--智能指针(三) unique_ptr

發布時間:2024/7/5 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入学习c++--智能指针(三) unique_ptr 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 幾種智能指針

1. auto_ptr: c++11中推薦不使用他(放棄)

2.?shared_ptr:?擁有共享對象所有權語義的智能指針?

3.?unique_ptr:?擁有獨有對象所有權語義的智能指針?

4.?weaked_ptr:?到?std::shared_ptr?所管理對象的弱引用?

1.1 unique_ptr

參考:https://zh.cppreference.com/w/cpp/memory/unique_ptr

  • std::unique_ptr?是通過指針占有并管理另一對象,并在?unique_ptr?離開作用域時釋放該對象的智能指針

  • 在下列兩者之一發生時用關聯的刪除器釋放對象:

    • 銷毀了管理的?unique_ptr?對象

    • 通過?operator=?或?reset()?賦值另一指針給管理的?unique_ptr?對象。

  • 通過調用?get_deleter()(ptr)?,用潛在為用戶提供的刪除器釋放對象。默認刪除器用?delete?運算符,它銷毀對象并解分配內存。

  • unique_ptr?亦可以不占有對象,該情況下稱它為空 (empty)。

  • std::unique_ptr?有兩個版本:

    • 管理個對象(例如以?new?分配)

    • 管理動態分配的對象數組(例如以?new[]?分配)

  • 類滿足可移動構造?(MoveConstructible) 和可移動賦值?(MoveAssignable) 的要求,但不滿足可復制構造?(CopyConstructible) 或可復制賦值?(CopyAssignable) 的要求。

1.2 注意

  • 只有非 const 的?unique_ptr?能轉移被管理對象的所有權給另一?unique_ptr?。若對象的生存期為?const?std::unique_ptr所管理,則它被限定在創建指針的作用域中。

  • ?std::unique_ptr?常用于管理對象的生存期,包含:

    • 通過正常退出經由異常退出兩者上的?受保證刪除,提供異常安全,給處理擁有動態生存期的對象的類和函數

    • 傳遞獨占的擁有動態生存期的對象的所有權到函數

    • 從函數獲得獨占的擁有動態生存期對象的所有權

1.3 使用方式

  • unique_ptr: 在某一個特定時刻,只有一個unique_ptr管理資源
  • 拷貝構造函數和 "=" 對于unique_ptr不存在
  • // UniqueObjectPtr(const UniqueObjectPtr&) = delete
    // UniqueObjectPtr(UniqueObjectPtr&&) = default
    // 把 資源轉移給別人

#include <iostream> #include <cassert> #include <memory> using namespace std;class Object { public:Object(int id) : m_id(id) {std::cout << "init obj " << m_id << std::endl;} ~Object() {std::cout << "bye bye " << m_id << std::endl;}int id() const {return m_id;} private:int m_id; };typedef unique_ptr<Object> UniqueObjectPtr; typedef std::shared_ptr<Object> ObjectPtr;void print(const UniqueObjectPtr& obj) {}void Transfer(UniqueObjectPtr obj) {cout << obj->id() << endl; }// unique_ptr: 在某一個特定時刻,只有一個unique_ptr管理資源 // 拷貝構造函數和 "=" 對于unique_ptr不存在 void uniquePtr() {UniqueObjectPtr obj(new Object(1));auto p = obj.get();if (p) {}//betterif (obj) {}//operator -> *cout << p->id() << " " << obj->id() << " " << (*obj).id() << endl;print(obj);p = obj.release(); // 自身不再管理該指針 delete p; // 之后,該指針可以按常規指針處理 obj.reset(); // 把以前管理的資源調用析構 obj.reset(new Object(2)); // 1. obj.reset(); 2. 管理新的指針// UniqueObjectPtr(const UniqueObjectPtr&) = delete// UniqueObjectPtr(UniqueObjectPtr&&) = default // 把 資源轉移給別人 Transfer(std::move(obj)); // 一個unique_ptr的值, 接收右值的引用 // 違反unique_ptr規則,上一行用函數形參傳入unique_ptr,對于原有obj 已經不在管理他的資源,obj掌握一個空指針assert(obj == nullptr); // cout << obj->id() << endl; // 某種情況下, 可能有其他類型也需要使用該 資源 // 轉移成其他 智能指針 obj.reset(new Object(4)) ;// 只能右值傳入 ObjectPtr sharedObj(std::move(obj));assert(obj == nullptr); // obj不再管理資源 }int main() {uniquePtr();return 0; }

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/douzujun/p/10803484.html

總結

以上是生活随笔為你收集整理的深入学习c++--智能指针(三) unique_ptr的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。