我听说auto_ptr在C++11中已被弃用。这是什么原因?我也想知道auto_ptr和shared_ptr的区别。 最佳答案 auto_ptr的直接替换(或者最接近的东西)是unique_ptr.就“问题”而言,它非常简单:auto_ptr在分配所有权时转移所有权。unique_ptr也转移所有权,但由于移动语义的编码和右值引用的魔力,它可以更自然地做到这一点。它也更好地“适合”标准库的其余部分(尽管公平地说,其中一些要归功于库的其余部分进行了更改以适应移动语义,而不是总是需要复制)。名称的更改也是(IMO)一个受欢迎的-auto
在试图找到shared_ptr的位置几个小时后,我现在非常沮丧。我看到的示例都没有显示包含shared_ptr标题的完整代码(和工作)。简单地说std,tr1和一点帮助都没有!我已经下载了boost,但仍然没有出现!有人可以告诉我在哪里可以找到它吗?感谢你让我发泄我的不满!编辑:我看到我的标题已更改。对于那个很抱歉。所以...这也是因为我不清楚shared_ptr是否“依赖于C++版本”-->这就是我没有说明我的环境的原因-->因此可能是我很难找到它的原因。我正在研究MSVS2008。编辑2:我不知道为什么,但我在到处寻找shared_ptr时包含了[memory]和[boost/
如果我有一个需要使用shared_ptr的函数,传递一个对它的引用不是更有效吗(以避免复制shared_ptr对象)?可能的不良副作用是什么?我设想了两种可能的情况:1)在函数内部,一个参数的拷贝,就像在ClassA::take_copy_of_sp(boost::shared_ptr&sp){...m_sp_member=sp;//Thiswillcopytheobject,incrementingrefcount...}2)在函数内部只使用参数,就像在Class::only_work_with_sp(boost::shared_ptr&sp)//Again,nocopyhere{.
我想知道是什么让程序员选择Pimpl习惯用法或纯虚拟类和继承。我知道pimplidiom为每个公共(public)方法和对象创建开销都提供了一个显式的额外间接。另一方面,纯虚拟类带有用于继承实现的隐式间接(vtable),我知道没有对象创建开销。编辑:但是如果您从外部创建对象,则需要一个工厂是什么让纯虚类不如pimpl成语那么受欢迎? 最佳答案 在写C++类的时候,适当考虑一下会不会是值类型按值(value)复制,身份从来都不重要。它适合作为std::map中的键。例如,“字符串”类,或“日期”类,或“复数”类。“复制”此类的实例是
我有一个包含unique_ptr成员的类。classFoo{private:std::unique_ptrbar;...};Bar是具有create()函数和destroy()函数的第三方类。如果我想在一个独立的函数中使用std::unique_ptr,我可以这样做:voidfoo(){std::unique_ptrbar(create(),[](Bar*b){destroy(b);});...}有没有办法将std::unique_ptr作为类的成员? 最佳答案 假设create和destroy是具有以下签名的自由函数(这似乎是OP
我发现一些代码使用std::shared_ptr在关机时执行任意清理。起初我认为这段代码不可能工作,但后来我尝试了以下方法:#include#include#includeclasstest{public:test(){std::cout>">v;{std::cout(newtest()));std::cout这个程序给出了输出:Atbeginofmain.creatingstd::vector>CreatingtestTestcreatedLeavingscopeLeavingmainTestdestroyed我对为什么这可能有效有一些想法,这与为G++实现的std::shared_
我正在尝试使用C++0xunique_ptrclass在map内像这样://compilewith`g++main.cpp-std=gnu++0x`#include#include#includeusingnamespacestd;structFoo{char*str;Foo(charconst*str_):str(strdup(str_)){}};intmain(void){typedefstd::map>Bar;Barbar;autoa=bar.insert(Bar::value_type(1,newFoo("one")));return0;}但是GCC给了我以下错误(缩短,我认为
我正在尝试使用C++0xunique_ptrclass在map内像这样://compilewith`g++main.cpp-std=gnu++0x`#include#include#includeusingnamespacestd;structFoo{char*str;Foo(charconst*str_):str(strdup(str_)){}};intmain(void){typedefstd::map>Bar;Barbar;autoa=bar.insert(Bar::value_type(1,newFoo("one")));return0;}但是GCC给了我以下错误(缩短,我认为
我一直在看Clangsourcecode我发现了这个片段:voidCompilerInstance::setInvocation(std::shared_ptrValue){Invocation=std::move(Value);}我为什么要std::move一个std::shared_ptr?转让共享资源的所有权有什么意义吗?我为什么不这样做呢?voidCompilerInstance::setInvocation(std::shared_ptrValue){Invocation=Value;} 最佳答案 我认为其他答案没有足够强
这个问题在这里已经有了答案:IsthePIMPLidiomreallyusedinpractice?(12个回答)关闭7年前。背景:PIMPLIdiom(指向IPLementation的指针)是一种实现隐藏技术,其中公共(public)类包装了在公共(public)类所属的库之外无法看到的结构或类。这对库的用户隐藏了内部实现细节和数据。在实现这个习惯用法时,为什么要将公共(public)方法放在pimpl类而不是公共(public)类上,因为公共(public)类的方法实现将被编译到库中,而用户只有头文件?为了说明,这段代码将Purr()实现放在了impl类上,并将其包装起来。为什么不