在C++17中,我们可以对类模板进行模板类型推导。所以很多make函数可能会过时。make_unique和make_shared怎么样?所以我们可以这样写unique_ptrmyPtr(newMyType());//vsautomyPtr=make_unique();那么我们可以忘记那些功能吗? 最佳答案 unique_ptr和shared_ptr都不能在没有明确提供类型的情况下构造,因为无法区分T*和T[]。编写unique_ptr{newint}格式错误。此外,std::make_shared不仅仅为您构造一个std::shar
在ScottMeyers的EffectiveC++中,第18项使接口(interface)易于正确使用且难以错误使用,他提到了nullshared_ptr:std::tr1::shared_ptrpInv(static_cast(0),getRidOfInvestment)和时尚分配操作pInv=...//makeretValpointtothecorrectobject在哪种情况下可能需要创建一个空的shared_ptr并稍后进行赋值?为什么不只要有资源(原始指针)就创建shared_ptr?由于ScottMeyers没有在前面的示例中显示完整的赋值,我认为shared_ptr的赋值
我只是在研究即将推出的新C++标准中的智能指针。但是我没有掌握shared_from_this函数的用法。这是我所拥有的:#include#includeclassCVerboseBornAndDie2:publicstd::enable_shared_from_this{public:std::stringm_Name;CVerboseBornAndDie2(std::stringname):m_Name(name){std::coutp=vbad->shared_from_this();}并在行中抛出std::bad_weak_ptr异常std::shared_ptrp=vbad-
我刚看到HerbSutter的演讲:C++andBeyond2012:HerbSutter-atomicWeapons,2of2他展示了std::shared_ptr析构函数实现中的错误:if(control_block_ptr->refs.fetch_sub(1,memory_order_relaxed)==0)deletecontrol_block_ptr;//B他说,由于memory_order_relaxed,delete可以放在fetch_sub之前。At1:25:18-Releasedoesn'tkeeplineBbelow,whereitshouldbe这怎么可能?存在h
当类具有默认构造函数时,我可以使用std::make_shared的实例化,就像使用指向函数的指针一样。这可能是因为实例化的模板必须编译并存储在内存中,并且它的地址必须存在。#include#includeclassDefaultConstructible{};typedefstd::function()>Generator;intmain(){Generatorgenerator(std::make_shared);std::shared_ptrdefConst=generator();return0;}但是当我添加一个非平凡的构造函数时,同样的事情失败了:#include#incl
对于下面的代码片段,它显示了方法中不同的引用计数。有人可以解释为什么这些值不同吗?classFoo{};voidf1(conststd::shared_ptr&ptr){std::cout&ptr){std::coutptr(newFoo);std::cout对应的输出:main():counts:1f1():counts:1f2():counts:2main():counts:1 最佳答案 请注意std::shared_ptr和std::shared_ptr是不同的类型(即具有不同模板类型参数的类模板实例化是不同的类型)。当你通过
最近我发现shared_ptr没有指向成员运算符->*的指针。我创建了一个简单的例子:templateautoinvoke1(Pointerp,Functionf,Args...args)->decltype((p->*f)(args...)){return(p->*f)(args...);}structA{voidg(){std::coutsa=std::make_shared();invoke1(sa,&A::g);//compileerror!!}Q1:为什么会这样?为什么shared_ptr没有这个运算符?我为shared_ptr添加了这样的运算符,示例开始运行:templat
例如,有一个查找对象的函数,如果找到对象则返回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()} 最佳答案 因此