c++ - 为什么 shared_ptr<> 必须分别为控制 block 和管理对象分配?

标签 c++ c++11 shared-ptr make-shared

此链接问题询问是否 make_shared<>函数和 shared_ptr<>构造函数不同。

What happens when using make_shared

部分答案是 make_shared<>通常会在一次分配中为指向对象和智能指针控制 block 分配内存。 shared_ptr<>构造函数使用两个分配。

cppreference声明构造函数“必须”这样做,但没有给出任何理由。

这是为什么?出于某种原因这是不可能的吗?还是因为其他原因被标准禁止?

最佳答案

想想 std::shared_ptr 构造函数是如何工作的:

std::shared_ptr<Foo>(new Foo());

首先对 new Foo() 表达式求值; ::operator newFoo 对象分配内存,然后构造它。生成的指针作为参数传递给 std::shared_ptr 构造函数。

看到问题了吗? Foo 分配已经执行!智能指针构造函数没有选项可以为同一分配中的控制 block 和对象分配空间,因为它不负责为对象分配内存。

另一方面,

std::make_shared 负责两者 分配,因此可以为两者分配空间在一次堆分配中,然后在该一次分配中放置新建构造对象和控制 block 。

关于c++ - 为什么 shared_ptr<> 必须分别为控制 block 和管理对象分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351877/

相关文章:

c++ - 在 C++ 中创建对三元运算符结果的 const 引用是否安全?

c++ - 模板化函数只接受右值

c++ - 在 std::shared_ptr 上使用 .reset() 是否会删除所有实例

c++ - 具有空值和自定义删除器的 shared_ptr 奇怪

c++ - 当 shared_ptr 的实例仍在范围内时共享指针的对象被删除

dllimport静态数据成员的C++定义

c++ - 编写新的 Eigen 表达式

c++ - 具有不同数量参数的函数的模板别名

c++ - 在 Win32 环境下从 ntdll.dll 调用 Nt 函数,C++

c++ - 包含具有无效位置的 NodeRef 的方式