我终于要将我的代码库迁移到C++11,这会产生更短更好的代码。但是我发现当我用一个新的指针调用函数时,它比以前长了很多:voidaddCallback(Callback*);//Takesownershipofcallback.//...addCallback(newCallback);//Clear.成为voidaddCallback(std::unique_ptr);//Nocommentneedednow!//...addCallback(std::move(std::unique_ptr(newCallback)));//bleh.提议的make_unique()模板函数只会在
假设我有一个要在类中初始化的unique_ptr成员对象,请参见下面的代码。为什么我必须使用统一初始化(花括号)?第二个声明吐出一个错误,类似于so.cpp:10:31:error:expectedparameterdeclaratorstd::unique_ptrupf2(newFoo);^so.cpp:10:31:error:expected')'so.cpp:10:30:note:tomatchthis'('std::unique_ptrupf2(newFoo);^2errorsgenerated.而且我不认为这是最令人烦恼的解析问题,至少我不这么认为。#includeclass
我有一个类层次结构,其中B源自A像这样:classA:publicstd::enable_shared_from_this{};classB:publicA{voidf(){//thecodebelowcompilesstd::shared_ptrcopyOfThis=std::static_pointer_cast(shared_from_this());//thecodebelowdoesnotstd::shared_ptrcopyOfThis=static_cast>(std::make_shared(shared_from_this()));}};所以实际上我想了解为什么我不能
我需要在这里使用shared_ptr,因为我无法更改API。Foo1*foo1=newFoo1(...);shared_ptrfoo2(foo1);这里的shared_ptr是否要处理释放foo1使用的内存?如果我理解正确,我不应该在foo1上调用delete,对吗? 最佳答案 是的。你是对的,但是初始化的正确方法foo2是:std::shared_ptrfoo2=std::make_shared();HerbSutter讨论了您应该使用std::make_shared()的原因这里:https://herbsutter.com/2
我正在处理别人的代码,其中包含很多这样的语句std::auto_ptrsmartptr(newObjectA(this));objects_list.push_back(smartptr.get());smartptr.release();这个有用吗?在这里使用智能指针而不是仅仅写有什么实际原因吗?objects_list.push_back(newObjectA(this)); 最佳答案 objects_list.push_back(newObjectA(this));这可能会泄漏内存。让我们看看当我们分解它时会发生什么:newO
我有一个对象(我们称它为X),其他对象可以通过std::shared_ptr访问它。然而,在某些时候,这些对象需要创建一个唯一的、非共享的X拷贝,因为它想要修改它。这在某种程度上类似于写时复制,但由于一些其他细节而不完全相同。基本上我想要这样的语义:structFoo{std::shared_ptrbar;voidgo(){//bar.use_count()>=1bar.make_this_object_unique();//bar.use_count()==1}} 最佳答案 如果你只是想复制对象,并得到一个指向新对象的共享指针,那
我想在我的项目中使用observer_ptr,但是paper只定义了接口(interface),没有完整的实现。有没有自己实现的简单方法? 最佳答案 您可以创建所谓的observer_ptr简单地创建一个unique_ptr使用NOP删除器。templatestructnop_deleter{voidoperator()(T*)const{}};templateusingobserver_ptr=unique_ptr;这仍然会有unique_ptr的行为,意味着它只能移动,而你想要observer_ptr可复制。这使我们实现了更简单
我有以下代码:#includeintmain(){int*a=newint(2);std::unique_ptrp(a);}导致这些错误信息:Infileincludedfroma.cpp:1:Infileincludedfrom/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/memory:81:/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/bits/
我想获得一种模板化的方法来查找类型是否为shared_ptr,并基于此我想对函数进行新的特化。示例主要功能是,templateinlinevoidCEREAL_LOAD_FUNCTION_NAME(RelaxedJSONInputArchive&ar,NameValuePair&t){std::cout如果t.value是shared_ptr那么我想要一个不同的函数特化。我已经在下面尝试过,templateinlinetypenamestd::enable_if::value,void>::typeCEREAL_LOAD_FUNCTION_NAME(RelaxedJSONInputAr
我想用std::shared_ptr替换我类(class)中的一些原始指针这样我在创建该类的拷贝时就不必担心了。但是原始指针指向一个动态数组。当你给它一个自定义删除器时,使用带有动态数组的shared_ptr是可能的,例如。G。default_delete.但是当我尝试为该字段分配一个新值时,我会得到一个很大的错误列表,即使是在构建时也是如此。这是一个最小的代码示例:#include#includeusingnamespacestd;templateshared_ptrmake_shared_array(size_tsize){returnshared_ptr(newT[size],d