草庐IT

c++ - 使用 make_shared 创建 shared_ptr 有什么缺点吗

使用make_shared()有什么缺点吗?而不是使用shared_ptr(newT).Boostdocumentation状态Therehavebeenrepeatedrequestsfromusersforafactoryfunctionthatcreatesanobjectofagiventypeandreturnsashared_ptrtoit.Besidesconvenienceandstyle,suchafunctionisalsoexceptionsafeandconsiderablyfasterbecauseitcanuseasingleallocationforbot

c++ - 如何将 unique_ptr 用于 pimpl?

这是我尝试将unique_ptr用于pimpl时所看到的简化。我选择unique_ptr是因为我真的希望类拥有指针-我希望pimpl指针和类的生命周期相同。不管怎样,这是标题:#ifndefHELP#defineHELP1#includeclassHelp{public:Help(intii);~Help()=default;private:classImpl;std::unique_ptr_M_impl;};#endif//HELP这里是来源:#include"Help.h"classHelp::Impl{public:Impl(intii):_M_i{ii}{}private:in

c++ - 如何将 unique_ptr 用于 pimpl?

这是我尝试将unique_ptr用于pimpl时所看到的简化。我选择unique_ptr是因为我真的希望类拥有指针-我希望pimpl指针和类的生命周期相同。不管怎样,这是标题:#ifndefHELP#defineHELP1#includeclassHelp{public:Help(intii);~Help()=default;private:classImpl;std::unique_ptr_M_impl;};#endif//HELP这里是来源:#include"Help.h"classHelp::Impl{public:Impl(intii):_M_i{ii}{}private:in

c++ - 为什么没有 std::shared_ptr<T[]> 特化?

该标准提供了std::unique_ptr的模板特化,它可以从其析构函数中正确调用delete[]:voidfunc(){std::unique_ptrarr(newint[10]);.......}使用std::shared_ptr这个特化是不可用的,所以有必要提供一个正确调用delete[]:的删除器voidfunc(){//Usageshared_ptrarray(newdouble[256],[](double*arr){delete[]arr;});..............}这仅仅是一个疏忽吗?(和有std::copy_if一样)还是有原因?

c++ - 为什么没有 std::shared_ptr<T[]> 特化?

该标准提供了std::unique_ptr的模板特化,它可以从其析构函数中正确调用delete[]:voidfunc(){std::unique_ptrarr(newint[10]);.......}使用std::shared_ptr这个特化是不可用的,所以有必要提供一个正确调用delete[]:的删除器voidfunc(){//Usageshared_ptrarray(newdouble[256],[](double*arr){delete[]arr;});..............}这仅仅是一个疏忽吗?(和有std::copy_if一样)还是有原因?

c++ - 将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?

更新:此示例中的shared_ptr与Boost中的类似,但它不支持shared_polymorphic_downcast(或dynamic_pointer_cast或static_pointer_cast)!p>我正在尝试在不丢失引用计数的情况下初始化指向派生类的共享指针:structBase{};structDerived:publicBase{};shared_ptrbase(newBase());shared_ptrderived;//error:invalidconversionfrom'Base*const'to'Derived*'derived=base;到目前为止,一切

c++ - 将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?

更新:此示例中的shared_ptr与Boost中的类似,但它不支持shared_polymorphic_downcast(或dynamic_pointer_cast或static_pointer_cast)!p>我正在尝试在不丢失引用计数的情况下初始化指向派生类的共享指针:structBase{};structDerived:publicBase{};shared_ptrbase(newBase());shared_ptrderived;//error:invalidconversionfrom'Base*const'to'Derived*'derived=base;到目前为止,一切

c++ - 具有 unique_ptr 的类的复制构造函数

如何为具有unique_ptr成员变量的类实现复制构造函数?我只考虑C++11。 最佳答案 由于unique_ptr无法共享,您需要深度复制其内容或将unique_ptr转换为shared_ptr。classA{std::unique_ptrup_;public:A(inti):up_(newint(i)){}A(constA&a):up_(newint(*a.up_)){}};intmain(){Aa(42);Ab=a;}正如NPE所提到的,您可以使用move-ctor而不是copy-ctor,但这会导致类的不同语义。move-c

c++ - 具有 unique_ptr 的类的复制构造函数

如何为具有unique_ptr成员变量的类实现复制构造函数?我只考虑C++11。 最佳答案 由于unique_ptr无法共享,您需要深度复制其内容或将unique_ptr转换为shared_ptr。classA{std::unique_ptrup_;public:A(inti):up_(newint(i)){}A(constA&a):up_(newint(*a.up_)){}};intmain(){Aa(42);Ab=a;}正如NPE所提到的,您可以使用move-ctor而不是copy-ctor,但这会导致类的不同语义。move-c

c++ - 为什么 shared_ptr<void> 合法,而 unique_ptr<void> 格式不正确?

这个问题确实符合标题:我很想知道造成这种差异的技术原因是什么,以及基本原理?std::shared_ptrsharedToVoid;//legal;std::unique_ptruniqueToVoid;//ill-formed; 最佳答案 这是因为std::shared_ptr实现了类型删除,而std::unique_ptr没有。由于std::shared_ptr实现了类型删除,它还支持另一个有趣的属性,即。它确实不需要删除器的类型作为模板类型参数到类模板。看看他们的声明:template>classunique_ptr;其中有D