为什么shared_ptr<>必须分别分配控制块和托管对象?

Why must shared_ptr<> allocate for the control block and managed object separately?

本文关键字:控制块 分配 对象 ptr shared lt gt 为什么      更新时间:2023-10-16

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

使用make_shared 时会发生什么

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

cppreference声明构造函数"必须"这样做,但没有给出原因。

为什么会这样?这是因为某种原因而不可能吗?还是因为其他原因被标准禁止?

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

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

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

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

另一方面,std::make_shared负责两个分配,因此可以在一个堆分配中为这两个分配分配空间,然后在该一个分配中放置对象和控制块的新构造。