欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于C++智能指針shared_ptr和unique_ptr能否互轉問題

 更新時間:2022年05月13日 11:20:28   作者:yanjunz  
C++中的智能指針最常用的是shared_ptr和unique_ptr,C++新手最常問的問題是我從一個函數(shù)中拿到unique_ptr,但要轉成shared_ptr才能使用,要怎么轉換?同理是否能將shared_ptr轉換成unique_ptr,面對這些問題,跟隨小編一起看看吧

C++中的智能指針最常用的是shared_ptr和unique_ptr,C++新手最常問的問題是我從一個函數(shù)中拿到unique_ptr,但要轉成shared_ptr才能使用,要怎么轉換?同理是否能將shared_ptr轉換成unique_ptr?

我們先簡單看看shared_ptr是什么。

std::shared_ptr<Widget> a = std::make_shared<Widget>();

這句代碼會在棧中創(chuàng)建一個shared_ptr對象,其最基本的2個指針,一個指向在堆中創(chuàng)建的Widget對象,一個指向一個引用計數(shù),方便后續(xù)記錄有多少個shared_ptr引用了該Widget對象。

std::shared_ptr<Widget> a = std::make_shared<Widget>();
std::shared_ptr<Widget> b = a;

當指向了b = a的賦值語句后,內存的狀態(tài)如下,也就是大家一起維護著Widget對象和引用計數(shù),C++11對count還沒有線程安全保護,新版C++對這塊已經做了支持,這也意味著性能會有所下降。

unique_ptr的實現(xiàn)則要簡單很多,他內部只維護了一個Ptr指針指向堆中的對象,并且不支持賦值等操作,只支持移動語義,也就是說有且只有一個指針能執(zhí)行Widget

std::unique_ptr<Widget> a = std::make_unique<Widget>();
std::unique_ptr<Widget> b = std::move(a);

那我們看看相互轉換的問題:

Q: unique_ptr轉換成shared_ptr?

由于unique_ptr的語義是唯一擁有ownership,那只要對他執(zhí)行move操作就能把ownership轉移出去給shared_ptr

std::unique_ptr<Widget> a = std::make_unique<Widget>();
std::shared_ptr<Widget> b = std::move(a);

這樣a就等價于nullptr,而b則指向了堆中的Widget對象,切count=1。

Q:shared_ptr轉換成unique_ptr?

由于shared_ptr本質上是多人擁有ownership,所以要轉換成語義更加嚴格的單人擁有ownership是做不到的,就像圖2中a和b都指向了同一個對象,這種情況如果要轉成一個unique_ptr c的話就需要同時清除掉a和b對于Widget的指向,這是很難做到的,所以標準里面不支持shared_ptr轉成unique_ptr。

一句話總結這個原則,嚴格條件的ownership能轉成寬松條件的ownership。

到此這篇關于如何理解shared_ptr和unique_ptr能否互轉的文章就介紹到這了,更多相關hared_ptr和unique_ptr互轉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 智能指針代碼解析

    C++ 智能指針代碼解析

    這篇文章主要介紹了c++ 智能指針基礎的相關資料,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-10-10
  • 解析VScode在Windows環(huán)境下c_cpp_properties.json文件配置問題(推薦)

    解析VScode在Windows環(huán)境下c_cpp_properties.json文件配置問題(推薦)

    這篇文章主要介紹了解析VScode在Windows環(huán)境下c_cpp_properties.json文件配置問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C語言與C++中關于字符串使用的比較

    C語言與C++中關于字符串使用的比較

    字符串是我們再熟悉不過的東西了,任何語言中字符串都是基礎都要經常用到,那么在不同語言中字符串的用法一樣嗎?下面我們來看看C語言與C++中字符串使用的比較
    2022-05-05
  • C語言實現(xiàn)無頭單鏈表詳解

    C語言實現(xiàn)無頭單鏈表詳解

    大家好,本篇文章主要講的是C語言實現(xiàn)無頭單鏈表詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C++特性之智能指針shared_ptr詳解

    C++特性之智能指針shared_ptr詳解

    shared_ptr是C++11提供的一種智能指針類,它足夠智能,可以在任何地方都不使用時自動刪除相關指針,從而幫助徹底消除內存泄漏和懸空指針的問題。本文主要是來和大家聊聊shared_ptr的使用,需要的可以參考一下
    2022-12-12
  • Protocol Buffer技術深入理解(C++實例)

    Protocol Buffer技術深入理解(C++實例)

    C++實例Protocol Buffer技術詳解,感興趣的朋友可以了解下
    2013-01-01
  • C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

    C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

    之前在?windows系統(tǒng)中開發(fā)應用時,?遇到需要進行線程同步的時候幾乎都是使用的事件內核對象?Event。本文為大家整理了C++實現(xiàn)一個簡易版的事件(Event)的相關資料,需要的可以參考一下
    2022-11-11
  • C++關鍵字const使用方法詳解

    C++關鍵字const使用方法詳解

    C語言中的const與C++有很大的不同,在C語言中用const修飾的變量仍是一個變量,表示這個變量是只讀的,不可顯示地更改,C++中的const關鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關鍵字是一種修飾符
    2022-12-12
  • 純C語言:遞歸組合數(shù)源碼分享

    純C語言:遞歸組合數(shù)源碼分享

    這篇文章主要介紹了純C語言:遞歸組合數(shù)源碼,有需要的朋友可以參考一下
    2014-01-01
  • C語言中自動隱式轉換與類型強制轉換實例分析

    C語言中自動隱式轉換與類型強制轉換實例分析

    這篇文章主要介紹了C語言中自動隱式轉換與類型強制轉換實例分析,需要的朋友可以參考下
    2014-07-07

最新評論