问题标签 [make-shared]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - shared_ptr 来自抽象类的 unique_ptr
我正在尝试遵循 Herb Sutter 的 C++ 指南,在这种情况下,我更喜欢unique_ptr
原始指针和shared_ptr
. 支持的论据之一std::unique_ptr
是可兑换为shared_ptr
是在某些时候需要
vector
在我的情况下,我有一个unique_ptr
我需要传递给一个需要一个vector
的方法shared_ptr
。我希望能够写出类似的东西:
这给我Xcode 7.1
配置了基于工具链的以下错误C++11
:
错误:字段类型“抽象”是一个抽象类。
当Abstract
我使用make_shared
. 这似乎使萨特先生的建议在很多情况下都行不通,所以我确定我一定做错了什么!我求助于写作:
有一个更好的方法吗?
c++11 - std::make_shared 和 std::forward — 有什么意义?
我试图理解为什么 std::make_shared 是这样声明/实现的:
我很好奇的是:
- 为什么
make_shared
只接受右值引用?为什么引用常量(即 )没有重载const _Args &
? - 打电话的意义
_VSTD::forward
何在?
好的解释或好的超链接都将受到高度赞赏。
c++ - 如何将删除器传递给 make_shared?
自 C++11 以来,由于多种原因,开发人员倾向于将智能指针类用于动态生命周期对象。并且对于那些新的智能指针类,标准,甚至建议不要使用new
他们建议使用make_shared
或make_unique
避免一些容易出错的运算符。
如果我们喜欢使用智能指针类,like shared_ptr
,我们可以构造一个like,
我们还想将自定义删除器传递给智能指针类,
另一方面,如果我们喜欢使用make_shared
来分配,例如。int
, 而不是 usenew
和shared_ptr
constructor ,就像上面的第一个表达式一样,我们可以使用
但是,如果我们还想将自定义删除器传递make_shared
给 怎么办,是否有正确的方法来做到这一点?似乎编译器,至少 gcc,给出了一个错误,
c++ - 如何使用模板构造函数调用 make_shared 或 make_unique
如何调用具有模板化构造函数的类make_shared
?make_unique
这是一个例子:
make_shared<A<T>>()
没有意义(也没有编译),因为那宁愿用于模板类,而不是模板构造函数。
既不make_shared<A><T>()
也不make_shared<A>(<T>())
编译——也不看起来像他们应该的那样。同上make_shared<A, T>()
有没有办法在调用中指定构造函数调用的模板make_shared
?我认为答案将适用make_unique
;如果不是,请指出。谢谢!
(为了阐明模板是如何工作的,我编辑了代码。)
c++ - 为什么要转发的 args 的 make_shared 和 allocate_shared 的签名不同?
为了给std::shared_ptr
给定的类型创建一个T
,有两种方法:std::allocate_shared
和std::make_shared
。
主要区别(或者至少,我对此问题感兴趣的那个)是前者通过给定分配器的副本进行所有内存分配。
从文档中,std::allocate_shared
具有以下签名:
另一方面,std::make_shared
被描绘为:
对于他们俩来说,都指出:
args... - 构造 T 实例的参数列表。
从现在开始,一切似乎都是正确的(额外的分配器、参数等)。
无论如何,据我所知,他们都应该将参数声明为通用引用,但事实并非如此(至少,从我在文档中看到的)。
换句话说,签名不std::allocate_shared
应该是以下吗?
他们不同是正确的还是那个网站的错误?
如果这是第一种情况,我在推理中遗漏了什么?
c++ - dynamic_pointer_cast 意外行为
我正在建立一个工厂类,我需要将 a 返回unique_ptr
到 a BaseClass
。返回的指针由一个DerivedClass
对象组成,该对象使用以下方法转换为共享指针make_shared
,然后转换为所需的BaseClass
指针:
我收到此编译器错误std::move
我正在使用VS2012 ...
为什么它使用与声明的 ( std::unique_ptr<BaseClass>
) 不同的东西?
不是dynamic_pointer_cast
返回一个std::unique_ptr<BaseClass>
ret 吗?
帮助您了解发生了什么。
c++ - shared_ptr 的原始指针构造函数是错误的吗?
事后看来,如果用 C++11 引入了给定的构造函数,它make_shared
会shared_ptr
接受一个原始指针吗?
是否有支持此构造函数的有力论据或用例?
它将避免有据可查的异常安全陷阱和使用.make_shared
我相信要求的另一个好处shared_ptr
我相信要求构建 viamake_shared
是它可以是引擎盖下的单个指针,从而降低其内存使用并使atomic_compare_exchange 之类的事情变得更简单(并且可能更有效)。(参见C++Now 的演示文稿)
我知道一个基本上是 intrusive_ptr(对象和控制块合并)的 shared_ptr 将缺少当前 std::shared_ptr 具有的功能。喜欢:
将对象与控制块分开释放的能力(如果您长期使用weak_ptrs,这很好)
与向您提供原始指针并负责释放它们的库的兼容性
使用自定义删除器(或没有删除器,对于非拥有指针)保存任意资源的能力
在保持父对象活动的同时指向子对象(例如,成员)的能力。
我的建议是,这些功能可能不够常用(或者在将其用作RAII包装器的情况下)可能不是最合适的,以保证额外的成本:
- 指向控制块的单独指针
- (可能)更复杂的 atomic_compare_exchange 逻辑,可能不值得。
在C++98世界中(引入了 shared_ptr),make_shared 不太实用且对用户不太友好(缺少完美的转发需要引用包装器,并且缺少可变参数模板使得实现笨拙)。
c++ - 在我的测试中,make_shared(boost 或 stl)似乎比 shared_ptr+new 稍慢
我对我对 make_shared 性能(boost 或 stl)的理解有点怀疑,所以我想要一些意见。
在使用 C++ 开发应用程序时,我必须进行一些性能测试,最后我比较了 make_shared 和 shared_ptr+new (请注意,这不是提高性能的目的,我不希望在这里获得时间,但我现在只是好奇)
我用
- Debian 杰西 x64
- liboost 1.55
- GCC 4.9.2
我读到 make_shared 效率更高,根据我能找到的解释(分配编号、开销),这对我来说似乎是合乎逻辑的(据我所知)。
但是做一个快速而愚蠢的测试,我不明白我得到了什么
MyUselessClass 是一个简单的类,具有 3 个类属性(sting、bool、int),并且只有构造函数和析构函数。
“结果”(我引用是因为它当然不是一个准确的测试)如下(我将它运行到一个循环中以获得多次迭代,平均给出相同的结果):
如果我相信我的测试,make_shared 比调用 share_ptr 和新实例稍慢。如果我将任何差异视为纳秒精度,我会预料到,相反......
所以现在我想知道:
- 也许我的测试太愚蠢了,纳秒命令在那些操作中没有重要性?
- 也许我错过了对 make_shared 更好性能的解释?
- 也许我在测试中错过了一些(几个)点?
如果您对以下几点有一些答案,请不要犹豫:)
谢谢
c++ - enable_shared_from_this 和 make_shared 是否提供相同的优化
据我了解make_shared<T>(...)
,可能会提供一些内存分配优化(它可能会在与 T 类实例相同的内存块内分配引用计数器)。
enable_shared_from_this 是否提供相同的优化?所以:
是相同的:
如果不考虑 sizeof(T)。
c++11 - 构造共享指针的任何区别
有什么区别
需要详细解释。