例如,有一个查找对象的函数,如果找到对象则返回shared_ptr,并且必须以某种方式指示未找到对象。std::vectorStorage::objects;std::shared_ptrStorage::findObject(){if(objects.find){returnobjects[x];}else{returnnullptr;}}std::shared_ptrobj=Storage::findObject();if(obj){print("found");}else{print("notfound");}像上例那样返回用nullptr隐式初始化的shared_ptr是否正确
我有一个带有自定义删除器的std::shared_ptr,在那个删除器中,我想获取原始std::shared_ptr的临时拷贝。用代码形式表示:structFoo:publicstd::enable_shared_from_this{};voiddeleter(Foo*f){{std::shared_ptrtmp=f->shared_from_this();//LineA}deletef;}intmain(){std::shared_ptrfoo(newFoo,&deleter);}我的问题是:在A行,关于shared_from_this()的调用有什么可以说的吗?合法吗?如果是这样,
有没有办法阻止shared_from_this()调用堆栈分配的对象?基类列表中的enable_shared_from_this是类用户的强指标,但有没有办法强制正确使用?示例代码:classC:publicenable_shared_from_this{public:shared_ptrmethod(){returnshared_from_this();}};voidfunc(){Cc;shared_ptrptr=c.method();//exceptioncomingfromshared_from_this()} 最佳答案 因此
假设我有这样的类classA{public:A(inta,boost::shared_ptrptr){//whatever!}};我的问题是,该ptr的默认值是多少?我希望能够使用创建该类的实例AmyA(5);当然我知道我可以用一个参数创建另一个构造函数,但我正在寻找类似的东西A(inta,boost::shared_ptrptr=WAT?)这可能吗?目前我使用的是双构造函数方式,但这样做会很棒。 最佳答案 #includeA(inta,boost::shared_ptrptr=boost::make_shared())检查http
Boostdocumentation描述了从多个线程同时访问共享指针时的行为。他们特别举了一些例子:shared_ptrp(newint(42));//---Example1---//threadAshared_ptrp2(p);//readsp//threadBshared_ptrp3(p);//OK,multiplereadsaresafe//---Example2---//threadAp.reset(newint(1912));//writesp//threadBp2.reset();//OK,writesp2//---Example3---//threadAp=p3;//re
异常是C++的重要组成部分,使用它的原因之一(我知道还有很多更重要的其他原因)是为了避免使用大量if混淆代码的不必要的检查>陈述(也许这是一个不正确的假设?)。所以现在我很好奇为什么std::shared_ptr::operator*和std::shared_ptr::operator->不抛出null_ptr_exception或类似的? 最佳答案 我的理解是,智能指针类的设计看起来和行为都像原始指针。鉴于此指导设计原则,理想情况下,遗留代码可以使用等效所有权语义简单地将原始指针的使用替换为智能指针,并且代码将像以前一样工作。因此
在C++中,我可以这样写:shared_ptra_sp=someFunctionReturningSharedPtr();if(a_sp){coutsomeData为什么if(a_sp)检查工作正常?a_sp不是bool值,但如何检查它是真还是假?if条件如何知道检查a_sp.get()函数的结果?或者,如果没有,如何检查a_sp的NULL性?shared_ptr中是否定义了一些将其转换为bool值的函数? 最佳答案 shared_ptr有一个operatorunspecified-bool-type()const允许它在bool上
在VisualStudio2010/2011中缺少可变参数模板(仍然!),采用大量参数的构造函数可能会出现问题。例如,以下不会编译:MyMaterials.push_back(std::make_shared(MyFacade,name,ambient,diffuse,specular,emissive,opacity,shininess,shininessStrength,reflectivity,bumpScaling,maps,mapFlags));,因为它有13个参数,我认为make_shared仅限于arg0到arg9。明显的解决方法是两部分构造,但我希望避免这种情况。除了使
我面临这样一种情况,我有一个基类的boost::shared_ptr的std::vector。在我的程序过程中,我也需要在该vector中存储指向派生类对象的共享指针,并且在程序稍后的某个时间,需要检索这些共享指针。以下代码说明了我的问题:#include#includeusingnamespacestd;#include#includeclassBase{public:virtual~Base(){}};/******************************************/typedefboost::shared_ptrBasePtr;/**************
是否std::make_shared()值初始化我的POD?如果是,这是标准保证的吗?如果不是(正如我怀疑的那样),有没有办法做到这一点?我猜std::make_shared(POD())会做,但这是我应该做的吗? 最佳答案 是的,它是值初始化的,这是由标准保证的:§20.7.2.2.6,2:(关于make_shared)Effects:AllocatesmemorysuitableforanobjectoftypeTandconstructsanobjectinthatmemoryviatheplacementnewexpress