相关疑难解决方法(0)

C++中make_shared和普通shared_ptr的区别

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Run Code Online (Sandbox Code Playgroud)

许多google和stackoverflow帖子就在这里,但我无法理解为什么make_shared比直接使用更有效shared_ptr.

有人可以一步一步解释我创建的对象序列和两者所做的操作,这样我就能理解make_shared效率如何.我在上面给出了一个例子供参考.

c++ shared-ptr c++11

252
推荐指数
5
解决办法
9万
查看次数

为什么使用std :: make_*而不是构造函数更好?

有些情况下,与启动STL一些功能make_前缀一样std::make_pair,std::make_shared,std::make_unique等它为什么一个更好的做法是使用它们,而不是简单地使用构造?

auto pair2 = std::pair< int, double >( 1, 2.0 );
auto pair3 = std::make_pair( 1, 2.0 );

std::shared_ptr< int > pointer1 = std::shared_ptr< int >( new int( 10 ) );
std::shared_ptr< int > pointer2 = std::make_shared< int >( 10 );
Run Code Online (Sandbox Code Playgroud)
  • 我只是看到这些函数使代码变得更短,但这就是全部吗?
  • 还有其他优点吗?
  • 这些功能更安全吗?

c++ std c++11

19
推荐指数
2
解决办法
1902
查看次数

new和make_shared用于共享指针

我发现了这篇文章,其中一个答案是@kerek SB说的

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Run Code Online (Sandbox Code Playgroud)

在你的代码中,第二个变量只是一个裸指针,而不是一个共享指针.

现在就肉了.make_shared(实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配.相比之下,采用裸对象指针的shared_ptr的构造函数必须为引用计数分配另一个动态变量.权衡是make_shared(或其表兄allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的.

(这不会影响对象本身的构造.从Object的角度来看,两个版本之间没有区别.更有效的是共享指针本身,而不是托管对象.)

现在我对这篇文章有两个问题,如果有人能澄清一下,我会很感激

  1. 为什么第二个不是共享指针?这不会增加引用计数

  2. make_shared如何只进行一次内存分配,而new将两次内存分配,从而使make_shared更有效率?

对此有点澄清将不胜感激.

c++ pointers shared-ptr make-shared

6
推荐指数
2
解决办法
3050
查看次数

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

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

使用make_shared时会发生什么

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

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

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

c++ shared-ptr make-shared c++11

4
推荐指数
1
解决办法
972
查看次数

cpp make_shared用于void指针

我想使用std :: make_shared来创建一个void指针.因为make_shared应该比shared_ptr(new T)快,并且异常保存我想知道是否有一个库函数以make_shared方式创建shared_ptr(new foo).

c++ smart-pointers c++11

1
推荐指数
1
解决办法
1810
查看次数

标签 统计

c++ ×5

c++11 ×4

shared-ptr ×3

make-shared ×2

pointers ×1

smart-pointers ×1

std ×1