草庐IT

together_unique

全部标签

c++ - 使用 reset 初始化 unique_ptr 是个坏习惯吗?

当我需要一个类型为std::unique_ptr的数据成员时,那么我通常使用std::unique::reset()初始化这个unique_ptr用一个新的对象。下面是一个简化的例子:classA{public:voidSetValue(intx){data_.reset(newB(x));}private:std::unique_ptrdata_;};在代码审查中,一位审查者提到这是一个坏习惯,他让我不要使用reset()。如果可能的话。相反,他建议使用以下方法:std::make_unique或者像下面这样的模板函数:templatestructMakeUniqueResult{u

c++ - unique_ptr 删除器开销

在正常的C++设计中,大多数对象都可以通过delete删除。声明,free函数,或库特定的等效于free.对于此类对象,unique_ptrDeleter实现可以是通过空基类优化消除的无状态对象。但是,某些库需要使用另一个对象(可能包含函数指针或其他上下文)从该库中删除对象。typedefstructlib_objectlib_object;structlib_api{lib_object(*createInstance)();void(*freeInstance)(lib_object*o);};可以将其包装在unique_ptr中通过存储lib_api作为自定义数据成员的指针Del

c++ - Pimpl with unique_ptr : Why do I have to move definition of constructor of interface to ".cpp"?

只要我不将构造函数(B)的定义移动到标题B.h中,代码就可以工作。B.hclassImp;//imp;B();//B.cpp#include"B.h"#include"Imp.h"B::B(){}~B::B(){}Imp.hclassImp{};Main.cpp(编译我)#include"B.h"Error:deletionofpointertoincompletetypeError:useofundefinedtype'Imp'C2027我能以某种方式理解必须将析构函数移动到.cpp,因为可能会调用Imp的解构:-deletepointer-of-Imp;//somethinglik

c++ - 将带有 unique_ptr 的可变 lambda 传递给 const& std::function

我有一个调度函数,它在主线程中执行给定的lambda。为了这个问题,假设它看起来像下面这样:voiddispatch(conststd::function&fn){fn();}我需要在不中断主线程的情况下在新线程中加载新对象。所以我执行以下操作:1)启动一个新线程并在线程内创建一个新的唯一指针,2)调用dispatch并将新的唯一指针传播到它所属的位置。std::unique_ptrfoo;//nullptr//dotheloadinginanewthread:std::threadt([&](){//inthenewthread,loadnewvalue"Blah"andstorei

c++ - 优化编译器能否从 std::unique_ptr 中移除所有运行时成本?

阅读关于std::unique_ptr的http://en.cppreference.com/w/cpp/memory/unique_ptr,我天真的印象是,一个足够聪明的编译器可以用裸指针替换unique_ptr的正确使用,并在unique_ptr时放入一个delete被摧毁。事实真的如此吗?如果是这样,是否有任何主流优化编译器真的这样做了?如果不是,是否可以编写一些具有unique_ptr的部分/全部编译时安全优势的东西,可以优化为没有运行时成本(空间或时间)?注意那些(适本地)担心过早优化的人:这里的答案不会阻止我使用std::unique_ptr,我只是好奇它是一个非常棒的工具

c++ - std::unique_ptr::release() 与 std::move()

我有一个表示运行时上下文并构建树的类,树根保存在unique_ptr中。构建树完成后,我想提取树。这是它的样子(不可运行,这不是调试问题):classContext{private:std::unique_ptrroot{newNode{}};public://imagineaconstructor,attributesandmethodstobuildatreestd::unique_ptrextractTree(){returnstd::move(this->root);}};所以我使用std::move()从Context实例中提取根节点。但是,除了使用std::move()之外

c++ - 是否可以在 Xcode 5.1 中使用 std::make_unique?

由于Xcode5.1包含clang3.4,因此应该可以使用std::make_unique。好像是在memory.h中定义的。但是,它需要有_LIBCPP_STD_VER>11但由于__cplusplus宏的值,它仍然设置为11(仍然是201103L).有办法改变吗? 最佳答案 如clangwebsite中所述,您需要启用-std=c++1y。Xcode在其“C++语言版本”选项中不包含此选项作为选项,因此您需要手动输入它。为此,您需要在项目定义打开时进入“编辑器”菜单,然后按“显示定义”。您现在应该能够手动将“C++语言方言”选项

c++ - "Use of undefined type"带有 unique_ptr 以转发声明的类和默认移动构造函数/赋值

在下面的代码中,是避免编译错误并在A.cpp中手动包含B.h实现移动构造函数/赋值的唯一方法吗?//A.h#includeclassB;//implementationsomewhereinB.h/B.cppclassA{public:A()=default;~A()=default;A(constA&)=delete;A&operator=(constA&)=delete;A(A&&)=default;A&operator=(A&&)=default;private:std::unique_ptrm_b;};VisualStudio2015给出“错误C2027:使用未定义类型”,因为

c++ - std::unique_ptr 删除函数,initializer_list - 驱动分配

全部,当我使用初始化列表格式实例化小部件数组时,指向成员变量小部件实例的裸指针可以编译,但在更改为std::unique_ptr后,gcc会给出有关已删除函数的编译错误。$uname-aLinux..3.5.0-21-generic#32-UbuntuSMP2012年12月11日星期二18:51:59UTCx86_64x86_64x86_64GNU/Linux$g++--versiong++(Ubuntu/Linaro4.7.2-5ubuntu1)4.7.2此代码给出以下编译器错误:#include#includeclassWidget{public:Widget(){}};class

c++ - 通过取消引用复制 std::unique_ptr 的值

我写了下面的代码,我试图将unique_ptr对象的值复制到一个结构中。#include#includeusingnamespacestd;structS{S(intX=0,intY=0):x(X),y(Y){}//S(constS&){}//S&operator=(constS&){return*this;}intx;inty;std::unique_ptrptr;};intmain(){Ss;s.ptr=std::unique_ptr(newS(1,4));Sp=*s.ptr;//Copythepointer'svaluereturn0;}它在VisualC++2012中弹出错误: