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

Pra*_*tic 4 c++ shared-ptr make-shared c++11

这个链接的问题询问make_shared<>函数和shared_ptr<>构造函数是否不同.

使用make_shared时会发生什么

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

cppreference指出构造函数"必须"这样做,但没有给出任何理由.

为什么是这样?是出于某种原因不可能吗?或者由于其他原因,标准是否禁止它?

cdh*_*wie 15

想想std::shared_ptr构造函数的工作原理:

std::shared_ptr<Foo>(new Foo());
Run Code Online (Sandbox Code Playgroud)

首先new Foo()评估表达式; ::operator newFoo对象分配内存然后构造它.结果指针作为参数传递给std::shared_ptr构造函数.

看到问题?该Foo分配已经完成!智能指针构造函数无法为同一分配中的控制块和对象分配空间,因为它不负责为对象分配内存.

std::make_shared,在另一方面,是负责两个分配,因此它可以分配在一个堆分配室两者,然后放置-新构造两者的一个分配内的对象和控制块.