我正在尝试使用unique_ptr到接受unique_ptr的函数中的派生类到基类。比如:classBase{};classDerived:publicBase{};voidf(unique_ptrconst&base){}…unique_ptrderived=unique_ptr(newDerived);f(derived);如果我理解thisanswer正确地,这段代码应该可以工作,但它会导致以下编译错误:errorC2664:'f':cannotconvertparameter1from'std::unique_ptr'to'conststd::unique_ptr&'Intel
是boost::scoped_ptr之间的唯一区别和std::unique_ptr事实std::unique_ptr具有移动语义,而boost::scoped_ptr只是一个get/reset智能指针? 最佳答案 不,但这是最重要的区别。另一个主要区别是unique_ptr可以有一个析构函数对象,类似于shared_ptr能够。不像shared_ptr,析构函数类型是unique_ptr的一部分的类型(分配器是STL容器类型的一部分)。一个constunique_ptr可以有效地完成scoped_ptr的大部分工作可以做;确实,不像
在C++11中,您可以使用shared_ptr建立与对象或变量的所有权关系和weak_ptr以非拥有的方式安全地引用该对象。您也可以使用unique_ptr建立与对象或变量的所有权关系。但是,如果其他非拥有对象也想引用该对象怎么办?weak_ptr在这种情况下没有帮助。原始指针很有帮助,但也带来了各种缺点(例如,它们可以是automaticallyinitializedtonullptr,但这是通过与std::*_ptr类型不一致的技术来实现的)。weak_ptr的等价物是什么?对于通过unique_ptr拥有的对象的非拥有引用?这是一个清晰的示例,类似于我正在开发的游戏中的某些内容。
在boost库中是否有C++1x的std::unique_ptr的等效类?我正在寻找的行为是能够拥有一个异常安全的工厂函数,就像这样......std::unique_ptrcreate_base(){returnstd::unique_ptr(newDerived);}voidsome_other_function(){std::unique_ptrb=create_base();//Dosomestuffwithbthatmayormaynotthrowanexception...//Nowbisdestructedautomagically.}编辑:现在,我正在使用这个hack,
我有一个关于C++11最佳实践的问题。清除shared_ptr时,我应该使用不带参数的reset()函数,还是应该将shared_ptr设置为nullptr?例如:std::shared_ptrfoo(newstd::string("foo"));foo.reset();foo=nullptr;有什么真正的区别,或者这两种方法都有优点/缺点吗? 最佳答案 Isthereanyrealdifference,orarethereadvantages/disadvantagestoeitherapproach?这两种选择是绝对等价的,因为
下面的等价物是什么:std::vectorvec;vec.push_back(NULL);在处理boost::shared_ptr时?是下面的代码吗?std::vector>vec;vec.push_back(boost::shared_ptr());注意:我可能会推回很多这样的对象。我应该在某处声明一个全局静态nullPtr对象吗?这样就只需要构建其中一个:boost::shared_ptrnullPtr; 最佳答案 您的建议(调用不带参数的shared_ptr构造函数)是正确的。(调用值为0的构造函数是等效的。)我认为这不会比调
根据N3290,std::unique_ptr在其构造函数中接受一个删除器参数。但是,我无法在Windows中使用VisualC++10.0或MinGWg++4.4.1,在Ubuntu中也无法使用g++4.6.1。因此,我担心我对它的理解不完整或错误。我看不出明显被忽略的删除器参数的意义,所以任何人都可以提供一个工作示例吗?最好我也想看看unique_ptrp=unique_ptr(newDerived)是如何工作的.可能使用标准中的一些措辞来支持示例,即,无论您使用什么编译器,它实际上都做了它应该做的事情? 最佳答案 这在MSVC
我在整个应用程序中广泛使用std::tr1::shared_ptr。这包括将对象作为函数参数传入。考虑以下几点:classDataset{...}voidf(shared_ptrpds){...}voidg(shared_ptrpds){...}...虽然通过shared_ptr传递数据集对象可以保证其存在于f和g中,但函数可能会被调用数百万次,这会导致创建和销毁大量shared_ptr对象。这是最近运行的平面gprof配置文件的片段:Eachsamplecountsas0.01seconds.%cumulativeselfselftotaltimesecondssecondscall
我在测试中被问到以下关于评估++*ptr++的问题(我不想自己写。测试问了它。我仍然知道它的错误代码)intAr[]={6,3,8,10,4,6,7};int*Ptr=Ar;cout但是,我怀疑这是未定义的行为,因为它可以是(++*ptr)++或++(*ptr++)。是吗?我对文档不太熟悉,所以我找不到任何东西。 最佳答案 HoweverIsuspectthisisundefinedbehavioursinceitcanbeboth(++*ptr)++or++(*ptr++).Isit?并非如此,与运行时行为不同,它为实现者提供了充
这更像是一个答案而不是一个问题,因为我已经弄清楚了,至少就干净地编译库而言。我的主要问题是让shared_ptr工作。成分:Boostv.1.45.0http://www.anddev.org/viewtopic.php?p=29939上的STLport版本.NDK版本r4b。路线:在您的Android.mk文件中添加:LOCAL_CFLAGS+=-DBOOST_EXCEPTION_DISABLE-D_STLP_NO_EXCEPTIONS-DOS_ANDROID-D_STLP_USE_SIMPLE_NODE_ALLOC在STLport/STL/_string.h的第613行删除对__S