使用 std::make_shared
构造 std::shared_ptr
通常更好。
-
效率:
std::make_shared
在单个操作中分配内存,同时为对象和其引用计数分配空间,减少了一次内存分配和释放的开销。 -
异常安全:使用
new
后再置入shared_ptr
在构造过程中可能因为异常导致内存泄露,而std::make_shared
避免了这个问题,因为它只有一个操作。 -
代码简洁:
std::make_shared
能以更简洁的代码完成同样的工作。
make_shared实现原理
std::make_shared
的实现主要包含以下步骤:
-
分配一块足够大的内存,用来存储对象本身和控制块(包括引用计数和弱引用计数)。
-
在分配得到的内存上构造对象,构造控制块。
-
返回指向新构造对象的
std::shared_ptr
。