8

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

使用 make_shared 时会发生什么

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

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

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

4

1 回答 1

19

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

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

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

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

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

于 2014-10-14T02:54:40.463 回答