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
是推荐的方式,除非在特定场景下需要精细控制对象的构造或内存管理。****