此链接问题询问是否 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 new
为Foo
对象分配内存,然后构造它。生成的指针作为参数传递给 std::shared_ptr
构造函数。
看到问题了吗? Foo
分配已经执行!智能指针构造函数没有选项可以为同一分配中的控制 block 和对象分配空间,因为它不负责为对象分配内存。
std::make_shared
负责两者 分配,因此可以为两者分配空间在一次堆分配中,然后在该一次分配中放置新建构造对象和控制 block 。
关于c++ - 为什么 shared_ptr<> 必须分别为控制 block 和管理对象分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351877/