std::make_shared
是 C++11 引入的一個標準庫函式,用於建立一個 std::shared_ptr
,並在堆上分配所需的物件。
它的功能是將物件的建立和 shared_ptr
的初始化合並在一起,提高了效率和安全性。
使用方法:
auto ptr = std::make_shared<T>(args...);
- T: 共享指標所管理的物件的型別。
- args...: 傳遞給
T
建構函式的引數。
特點:
- 高效:
std::make_shared
會在一次記憶體分配中同時為物件和引用計數器分配空間,減少了單獨使用new
和std::shared_ptr
時可能需要的兩次記憶體分配。 - 安全:減少了手動
new
物件帶來的記憶體洩漏風險,不需要顯式delete
,因為shared_ptr
會自動管理物件的生命週期。 - 簡潔:相比於直接使用
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
優點:
- 效能:減少了記憶體分配和釋放次數,提升了效能。
- 簡潔:避免手動使用
new
和delete
,程式碼更加清晰易懂。 - 安全:自動管理記憶體,避免記憶體洩漏。
與 new
的區別:
// 使用 new 和 shared_ptr
std::shared_ptr<T> ptr(new T(args...));
// 使用 make_shared
auto ptr = std::make_shared<T>(args...);
區別:
make_shared
在堆上分配物件和引用計數器時只進行一次記憶體分配,而new
和shared_ptr
組合時是兩次記憶體分配。make_shared
更加安全,因為shared_ptr
的構造和物件的分配是一體的,避免了潛在的記憶體洩漏風險。
因此,std::make_shared
是推薦的方式,除非在特定場景下需要精細控制物件的構造或記憶體管理。****