这个链接的问题询问make_shared<>
函数和shared_ptr<>
构造函数是否不同。
部分答案是,make_shared<>
通常会在一次分配中为指向对象和智能指针控制块分配内存。构造shared_ptr<>
函数使用两个分配。
cppreference声明构造函数“必须”这样做,但没有给出任何理由。
为什么是这样?由于某种原因是不可能的吗?还是由于其他原因被标准禁止?
这个链接的问题询问make_shared<>
函数和shared_ptr<>
构造函数是否不同。
部分答案是,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
另一方面,它负责两个分配,因此可以在一个堆分配中为两者分配空间,然后在该分配中放置新构造对象和控制块。