为什么shared_ptr<>必须分别分配控制块和托管对象?
Why must shared_ptr<> allocate for the control block and managed object separately?
此链接问题询问make_shared<>
函数和shared_ptr<>
构造函数是否不同。
使用make_shared 时会发生什么
部分答案是make_shared<>
通常会在一次分配中为指向对象和智能指针控制块分配内存。shared_ptr<>
构造函数使用两个分配。
cppreference声明构造函数"必须"这样做,但没有给出原因。
为什么会这样?这是因为某种原因而不可能吗?还是因为其他原因被标准禁止?
想想std::shared_ptr
构造函数是如何工作的:
std::shared_ptr<Foo>(new Foo());
首先对new Foo()
的表达进行评估;::operator new
为Foo
对象分配内存,然后构造它。生成的指针作为参数传递给std::shared_ptr
构造函数。
看到问题了吗?Foo
分配已经执行!智能指针构造函数没有选项在同一分配中为控制块和对象分配空间,因为它不负责为对象分配内存。
另一方面,std::make_shared
负责两个分配,因此可以在一个堆分配中为这两个分配分配空间,然后在该一个分配中放置对象和控制块的新构造。
相关文章:
- 堆分配对于大型块中的分页是否更有效?
- 在C++中分配一个大内存块
- 分配/访问2d阵列,使得2d子块是连续的
- 在线程退出之前,线程分配的内存块是否与线程本身具有相同的相关性?
- 将大向量分块为较小的向量,而无需额外的堆分配
- C/C 内存分配块
- 如何控制运算符 [] 分配的值
- PC何时在if块内部分配静态char*
- 子分配内存块
- 变量的块结构内存分配
- 如何根据模板参数控制内存分配
- 安置新的和第三方控制的分配
- 无效的free() / delete / delete[] / realloc(), 4 字节在大小为 16 的块内分配
- 如果我使用共享内存,可以分配多少个块
- 标准::shared_ptr、标准::weak_ptr和控制块
- shared_ptr控制块内部的虚拟功能是什么?
- C++对象块分配与单个分配
- 设备控制块(DCB)中的fDummy2字段是为什么保留的
- 为什么shared_ptr<>必须分别分配控制块和托管对象?
- 如何在分配新块时控制' std::deque '的块大小