草庐IT

Unique_ptr

全部标签

C++ 当模板参数推导失败时

为什么C++不能确定我打算创建一个unique_ptr用这个语法?(a之前已声明为unique_ptr)a=unique_ptr(newA());必须包含似乎非常多余.这适用于我使用的大多数函数模板,为什么unique_ptr不行?编辑:C++现在支持make_unique,没有冗余。 最佳答案 std::unique_ptr是一个class模板,而不是function模板。参数推导只发生在function模板,而不是class模板。一个常用的技巧是编写一个函数模板,创建一个实例化类模板类型的对象,例如:templatestd::u

c++ - 我应该在使用之前检查 boost::shared_ptr 或 std::shared_ptr 吗?

voidf(boost::shared_ptrptr){if(ptr)//shouldwecheck?//dosomething}voidf2(int*p){if(p)//goodpracticetocheckbeforeusingit//dosomething}问题:我们是否应该在使用前验证shared_ptr? 最佳答案 没有。如果在函数的约定中它必须是有效的,那么引起人们注意调用者有错误这一事实的最快方法就是崩溃。尽早失败。 关于c++-我应该在使用之前检查boost::share

c++ - 多态性和 shared_ptr 成员

测试多态性&虚函数&shared_ptr,我试图理解以下最小示例描述的情况。classB{public://DefinitionofclassBvirtualvoidsomeBMethod(){//Makeaburger};};classC:publicB{public://DefinitionofclassCvoidsomeBMethod(){//Makeapizza};};classA{public:A(B&SomeB):Member(std::make_shared(SomeB)){};std::shared_ptrMember;};现在,我们基本上可以拥有intmain(){C

c++ - unique_ptr vs 类实例作为成员变量

有一个类SomeClass,它包含一些数据和操作这些数据的方法。并且必须使用一些参数创建它,例如:SomeClass(intsome_val,floatanother_val);还有另一个类,比如Manager,它包括SomeClass,并大量使用它的方法。那么,在性能(数据局部性、缓存命中等)方面会更好,将SomeClass的对象声明为Manager的成员并使用成员初始化在Manager的构造函数中或将SomeClass的对象声明为unique_ptr?classManager{public:Manager():some(5,3.0f){}private:SomeClasssome;

c++ - 访问 shared_ptr 数组

#includeintmain(){std::shared_ptrarray(newdouble[256],[](double*d){delete[]d;});}我制作了一个shared_ptr指向一个double组,它有自己的自定义删除器。现在如何访问数组?假设我希望访问索引为1的数组。我尝试了通常的“括号方法”,但出现错误。单词array默认指向它的第一个元素,但是如果我想访问第二个元素怎么办?使用增量和括号给我“不匹配运算符”错误。有人可以向我解释幕后发生的事情吗?我问这个是为了研究目的,尽管我知道unique_ptr和vector会做得更好。 最佳答

c++ - 任何类型的 unique_ptr 的 static_assert

我如何静态断言表达式是std::unique_ptr即std::unique_ptr对于任何T.static_assert(std::is_pointer()),"notasmartpointer")以上无效。如果没有什么直截了当的,我只对bool()感兴趣运算符是为类型定义的。 最佳答案 通过适当的部分特化创建您自己的特征:templatestructis_unique_ptr:std::false_type{};templatestructis_unique_ptr>:std::true_type{};

c++ - 智能指针与值作为成员变量

我有一个类A,它具有M和N类型的成员变量。这些对象的生命周期应该受A的生命周期限制。我在考虑classA{Mmember1;Nmember2;}对比classA{std::unique_ptrmember1;std::unique_ptrmember2;}我不完全确定哪个更好,因为它们都能实现我想要的。成员的生命周期与对象绑定(bind),我不需要手动管理内存。每种设置的优点和缺点是什么? 最佳答案 如果使用std::unique_ptrM和N是多态层次结构的基类member1和member2是可选成员,可以是nullptrM和N足

c++ - 强制转换为派生类的 ptr 到 ptr

这个问题在这里已经有了答案:Conversionofpointer-to-pointerbetweenderivedandbaseclasses?(2个答案)关闭6年前。如果我没有指定对Base**的显式转换,为什么会出现编译错误?处理派生类时可以使用指向指针的指针吗?classBase{};classChild:publicBase{};voidSomeFunction(Base**ppoObj){}voidSomeFunction(Base*poObj){}intmain(){Child*c=newChild();//Thispassed.SomeFunction(c);SomeF

c++ - 使用普通函数删除器构建 std::unique_ptr 的包装器

我正在尝试实现一个可以像这样使用的std::unique_ptr工厂:autofd=my_make_unique(fopen("filename","r"));即,将删除函数作为模板参数传递。我在C++11中的最佳尝试是:templatestructDeleter{voidoperator()(P*ptr){deleter(ptr);}};templatestd::unique_ptr>my_make_unique(P*ptr){returnstd::unique_ptr>(ptr);}在C++14中它更简洁:templateautomy_make_unique(P*ptr){stru

c++ - 复制构造函数中初始化列表中的 make_unique 是不使用 noexcept 说明符的良好目的吗?

我的复制构造函数旁边有一个noexcept说明符。#include#includeclassFoofinal{public:Foo()noexcept=default;Foo(constFoo&oth):impl_(std::make_unique()){}//impl_;};classFoo::Impl{...private:std::vectorsome_data;}当std::make_unique可以抛出bad_alloc时,我不确定是否应该将noexcept放在复制构造函数旁边。我们将不胜感激! 最佳答案 cpp编码指南在