std::make_shared

牛马chen發表於2024-10-07

std::make_shared 是 C++11 引入的一個標準庫函式,用於建立一個 std::shared_ptr,並在堆上分配所需的物件。
它的功能是將物件的建立和 shared_ptr 的初始化合並在一起,提高了效率和安全性。

使用方法:

auto ptr = std::make_shared<T>(args...);
  • T: 共享指標所管理的物件的型別。
  • args...: 傳遞給 T 建構函式的引數。

特點:

  1. 高效std::make_shared 會在一次記憶體分配中同時為物件和引用計數器分配空間,減少了單獨使用 newstd::shared_ptr 時可能需要的兩次記憶體分配。
  2. 安全:減少了手動 new 物件帶來的記憶體洩漏風險,不需要顯式 delete,因為 shared_ptr 會自動管理物件的生命週期。
  3. 簡潔:相比於直接使用 new,它使程式碼更加簡潔明瞭。

例子:

#include <iostream>
#include <memory>

struct MyClass {
    int value;
    MyClass(int v) : value(v) {
        std::cout << "MyClass constructor\n";
    }
    ~MyClass() {
        std::cout << "MyClass destructor\n";
    }
};

int main() {
    // 使用 make_shared 建立 shared_ptr
    std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(42);

    std::cout << "Value: " << ptr->value << std::endl;
    return 0;
}

輸出

MyClass constructor
Value: 42
MyClass destructor

優點:

  • 效能:減少了記憶體分配和釋放次數,提升了效能。
  • 簡潔:避免手動使用 newdelete,程式碼更加清晰易懂。
  • 安全:自動管理記憶體,避免記憶體洩漏。

new 的區別:

// 使用 new 和 shared_ptr
std::shared_ptr<T> ptr(new T(args...));

// 使用 make_shared
auto ptr = std::make_shared<T>(args...);

區別

  1. make_shared 在堆上分配物件和引用計數器時只進行一次記憶體分配,而 newshared_ptr 組合時是兩次記憶體分配。
  2. make_shared 更加安全,因為 shared_ptr 的構造和物件的分配是一體的,避免了潛在的記憶體洩漏風險。

因此,std::make_shared 是推薦的方式,除非在特定場景下需要精細控制物件的構造或記憶體管理。****

相關文章