std::make_shared 详解
1. std::make_shared 简介
std::make_shared 是 C++11 标准引入的一个函数模板,用于创建 std::shared_ptr 对象,并高效地分配和管理对象的内存。它比直接使用 std::shared_ptr 构造函数 std::shared_ptr<T>(new T(...)) 具有更好的性能和异常安全性。
2. 定义与参数
std::make_shared 是在 <memory> 头文件中定义的,原型如下:
namespace std {
template<typename T, typename... Args>
shared_ptr<T> make_shared(Args&&... args);
}
- T:要创建的对象类型。
- Args&&... args:用于
T构造函数的参数包。
返回值是一个 std::shared_ptr<T>,管理 T 类型的对象。
3. 优势
与 std::shared_ptr<T>(new T(...)) 相比,std::make_shared 主要有以下优点:
(1) 更少的内存分配
- 直接使用
new时:先分配一个T对象的内存,再为std::shared_ptr维护的控制块(引用计数等)分配内存。 std::make_shared只进行 一次内存分配,同时分配T对象和控制块,提高性能并减少内存碎片。
(2) 异常安全
- 使用
std::shared_ptr<T>(new T(...))时,如果new T(...)抛出异常,原始指针会泄漏。 std::make_shared避免了这种情况,因为它保证了在内存分配失败时不会产生泄漏。
(3) 代码更简洁
std::make_shared省去了new,代码更简洁易读。
4. 使用示例
(1) 基本用法
#include <iostream>
#include <memory>
struct Foo {
int x;
( a) : (a) { std::cout << ; }
~() { std::cout << ; }
};
{
std::shared_ptr<Foo> sp = std::<Foo>();
std::cout << << sp->x << std::endl;
;
}


