最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ make_shared 用法小結(jié)

 更新時間:2025年07月10日 09:13:20   作者:Ring__Rain  
std::make_shared是C++11引入的模板函數(shù),用于創(chuàng)建并管理std::shared_ptr智能指針,具有一定的參考價值,感興趣的可以了解一下

以下是C++中std::make_shared的用法詳解及核心要點,結(jié)合實踐場景和代碼示例說明:

?? ?一、基本用法與語法?

std::make_shared是C++11引入的模板函數(shù),用于創(chuàng)建并管理std::shared_ptr智能指針,語法如下:

#include <memory>
std::shared_ptr<T> ptr = std::make_shared<T>(構(gòu)造參數(shù)...);

?示例?:

class MyClass {
public:
    MyClass(int v) : data(v) {}
private:
    int data;
};
 
int main() {
    auto obj = std::make_shared<MyClass>(42); // 創(chuàng)建對象并初始化
    return 0;
}
  • ?作用?:替代new T(...),自動管理內(nèi)存生命周期,避免手動delete。

? ?二、核心優(yōu)勢?

1. ?性能優(yōu)化(一次內(nèi)存分配)??

?傳統(tǒng)方式?(std::shared_ptr<T>(new T)):
先分配對象內(nèi)存,再分配控制塊(引用計數(shù)等),共 ?2次內(nèi)存分配。

?**make_shared?:
將對象和控制塊合并為
單次內(nèi)存分配**,減少內(nèi)存碎片,提升性能(約30%速度提升)

std::shared_ptr<int> p1(new int(10));   // 2次分配(低效)
auto p2 = std::make_shared<int>(10);    // 1次分配(高效)

2. ?異常安全?

若構(gòu)造函數(shù)拋出異常,make_shared能保證已分配的內(nèi)存被自動釋放,而傳統(tǒng)方式可能泄漏:

// 傳統(tǒng)方式:若computePriority()拋出異常,new int的內(nèi)存泄漏
process(std::shared_ptr<int>(new int), computePriority());
 
// make_shared:異常安全
process(std::make_shared<int>(), computePriority()); 

由于make_shared是原子操作,避免了中間狀態(tài)導致的內(nèi)存泄漏。

3. ?代碼簡潔性?

  • 避免顯式new,減少代碼冗余。

?? ?三、實際應用場景?

1. ?共享對象所有權?

多個shared_ptr共享同一對象,引用計數(shù)歸零時自動釋放:

auto obj = std::make_shared<MyClass>();
auto obj2 = obj;  // 引用計數(shù)+1
std::cout << obj.use_count(); // 輸出2

對象在objobj2均析構(gòu)后釋放。

2. ?解決循環(huán)引用?

使用weak_ptr打破循環(huán)依賴:

class B; 
class A {
public:
    std::weak_ptr<B> b_ptr; // 弱引用
};
class B {
public:
    std::shared_ptr<A> a_ptr;
};
 
int main() {
    auto a = std::make_shared<A>();
    auto b = std::make_shared<B>();
    a->b_ptr = b; // 弱引用,不增加計數(shù)
    b->a_ptr = a; // 強引用
    return 0; // 正確釋放資源
}

若使用shared_ptr互相持有會導致內(nèi)存泄漏。

3. ?高效創(chuàng)建數(shù)組(C++20+)??

// C++20支持make_shared創(chuàng)建數(shù)組
auto arr = std::make_shared<int[]>(5); 
arr[0] = 42;

C++11/14需手動構(gòu)造:std::shared_ptr<int[]>(new int[5])。

?? ?四、使用限制與注意事項?

?不支持自定義刪除器?
make_shared無法指定刪除器,需直接使用shared_ptr構(gòu)造函數(shù)

auto ptr = std::shared_ptr<FILE>(fopen("file.txt", "r"), [](FILE* f){ fclose(f); });

?延遲內(nèi)存釋放問題?
對象內(nèi)存和控制塊合并分配后,若存在weak_ptr,則對象內(nèi)存需等到所有weak_ptr析構(gòu)才釋放(強引用計數(shù)為0時僅析構(gòu)對象,內(nèi)存塊可能未釋放)。

?適用場景?:對內(nèi)存敏感的系統(tǒng)需謹慎使用。

?私有構(gòu)造函數(shù)限制?
若類構(gòu)造函數(shù)為privateprotected,需通過友元或靜態(tài)工廠函數(shù)間接調(diào)用make_shared。

??? ?五、最佳實踐建議?

  • ?**優(yōu)先使用make_shared**?:除非需要自定義刪除器或處理私有構(gòu)造,否則默認選用。
  • ?避免循環(huán)引用?:成員指針優(yōu)先用weak_ptr,尤其父子對象互相引用時。
  • ?性能敏感場景?:高頻創(chuàng)建對象時(如實時系統(tǒng)),make_shared的性能優(yōu)勢更顯著。

?? ?總結(jié)?

std::make_shared是現(xiàn)代C++內(nèi)存管理的核心工具:

  • ?高效?:單次內(nèi)存分配提升性能;
  • ?安全?:異常安全避免泄漏;
  • ?簡潔?:代碼更清晰易維護。
    在共享所有權、資源自動釋放及高性能場景中不可或缺,但需注意其內(nèi)存釋放機制和構(gòu)造限制。

到此這篇關于C++ make_shared 用法小結(jié)的文章就介紹到這了,更多相關C++ make_shared內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 迷宮游戲控制臺版C++代碼

    迷宮游戲控制臺版C++代碼

    這篇文章主要為大家詳細介紹了迷宮游戲控制臺版C++代碼,可以調(diào)整大小的迷宮游戲,給定迷宮的入口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C語言如何用順序棧實現(xiàn)回文序列判斷

    C語言如何用順序棧實現(xiàn)回文序列判斷

    這篇文章主要為大家介紹了C語言如何用順序棧來實現(xiàn)回文序列的判斷,文中含有詳細的代碼示例及分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • VS2022中使用Copilot的圖文教程

    VS2022中使用Copilot的圖文教程

    大家都知道Copilot可以自動幫助寫代碼,那么這個工具是如果使用的呢?很多朋友不是很清楚,今天小編給大家分享一篇教程關于VS2022中使用Copilot的圖文教程,感興趣的朋友一起看看吧
    2022-04-04
  • 快速了解Boost.Asio 的多線程模型

    快速了解Boost.Asio 的多線程模型

    這篇文章主要介紹了Boost.Asio 的多線程模型的相關知識,文中代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)

    C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)

    這篇文章主要為大家介紹了C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C語言 TerminateProcess函數(shù)案例詳解

    C語言 TerminateProcess函數(shù)案例詳解

    這篇文章主要介紹了C語言 TerminateProcess函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • QT TCP實現(xiàn)簡單的通信示例

    QT TCP實現(xiàn)簡單的通信示例

    這篇文章主要為大家詳細介紹了QT TCP簡單的通信示例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++之類的靜態(tài)變量

    C++之類的靜態(tài)變量

    這篇文章主要介紹了C++之類的靜態(tài)變量的相關資料,需要的朋友可以參考下
    2015-06-06
  • Sersync+Rsync實現(xiàn)觸發(fā)式文件同步實戰(zhàn)過程

    Sersync+Rsync實現(xiàn)觸發(fā)式文件同步實戰(zhàn)過程

    sersync是使用c++編寫,而且對linux系統(tǒng)文 件系統(tǒng)產(chǎn)生的臨時文件和重復的文件操作進行過濾。下面通過本文給大家分享Sersync+Rsync實現(xiàn)觸發(fā)式文件同步實戰(zhàn)過程,需要的朋友參考下吧
    2017-09-09
  • 一文掌握C++?中使用變量從定義到實踐

    一文掌握C++?中使用變量從定義到實踐

    變量是用于存儲數(shù)據(jù)值的容器,在?C++?中,有不同類型的變量(使用不同的關鍵字定義),這篇文章給大家介紹C++?中使用變量從定義到實踐記錄,感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評論

右玉县| 金坛市| 界首市| 南江县| 怀远县| 宁城县| 长沙市| 石柱| 上杭县| 邛崃市| 丹巴县| 南昌市| 都昌县| 古丈县| 茶陵县| 绥中县| 新河县| 宁阳县| 余江县| 无为县| 健康| 枣阳市| 东明县| 泰和县| 阿拉善右旗| 江陵县| 绍兴市| 喀喇| 濉溪县| 云浮市| 白玉县| 兰考县| 红安县| 略阳县| 阿拉善右旗| 乌拉特前旗| 陇西县| 陈巴尔虎旗| 界首市| 汤原县| 高台县|