内存分配
std::make_shared
执行一次堆分配,而调用std::shared_ptr
构造函数执行两次。
在一个典型的实现中 std::shared_ptr
管理两个实体:
- 控制块(存储元数据,如引用计数、类型擦除删除器等)
- 被管理的对象
控制块是一个动态分配的对象,它包含:
- 指向托管对象的指针或托管对象本身;
- 删除器 (类型擦除)
- 分配器 (类型擦除)
- 拥有被管理对象的
shared_ptr
的数量 - 引用托管对象的
weak_ptr
的数量
std::make_shared
执行一次堆分配,计算控制块和数据所需的总空间。在另一种情况 std::shared_ptr<Obj>(new Obj("foo"))
下执行两次, new Obj("foo")
为托管数据调用堆分配,std::shared_ptr
构造函数为控制块执行另一个堆分配。