shared_ptr是Boost库中的引用计数智能指针。引用计数的问题在于它不能处理循环。我想知道如何在C++中解决这个问题。请不要提出诸如“不要循环”或“使用weak_ptr”之类的建议。编辑我不喜欢只使用weak_ptr的建议,因为显然如果你知道你会创建一个循环,那么你就不会有问题。如果您在运行时生成shared_ptrs,您也无法知道在编译时会有一个循环。因此,请自行删除其中使用weak_ptr的答案,因为我特别要求不要提供此类答案... 最佳答案 shared_ptr表示所有权关系。而weak_ptr代表awareness。
据我了解,有两种方法可以实现有时不返回结果的函数(例如在ppl列表中找到的人)。*-我们忽略原始ptr版本,与bool标志配对,并在未找到版本时出现异常。boost::optionalfindPersonInList();或std::unique_ptrfindPersonInList();那么有什么理由比另一个更喜欢一个吗? 最佳答案 这取决于:您希望返回句柄还是拷贝。如果你想返回一个句柄:Person*boost::optional都是可接受的选择。我倾向于使用Ptr在空访问的情况下抛出的类,但这是我的偏执狂。如果您希望返回拷贝
考虑以下程序:#include#include#include#includeclassFoo{public:Foo(){if(s_ct==0){throwstd::bad_alloc();}--s_ct;fprintf(stderr,"ctor%p\n",this);}~Foo(){fprintf(stderr,"dtor%p\n",this);}private:staticints_ct;};intFoo::s_ct=2;intmain(){try{std::list>l={std::make_shared(),std::make_shared(),std::make_shared
std::shared_ptr如何提供noexceptoperator=?当然,如果这个shared_ptr是最后一个,那么它必须销毁它的内容,并且不能保证那个对象的析构函数不会抛出,或者原来使用的自定义删除器不会扔。 最佳答案 对我来说似乎是个缺陷,虽然我在activeissueslist中找不到一个(虽然#2104类似)。根据[C++11:20.7.2.2.3/1],赋值定义为等价于shared_ptr(r).swap(*this);但根据[C++11:20.7.2.2.2],~shared_ptr本身不是noexcept。除非
一个unique_ptr不能被推回std::vector因为它是不可复制的,除非使用std::move.但是,如果F是一个返回unique_ptr的函数,那么std::vector::push_back(F())操作是允许的.下面有一个例子:#include#include#includeclassA{public:intf(){return_f+10;}private:int_f=20;};std::unique_ptrcreate(){returnstd::unique_ptr(newA);}intmain(){std::unique_ptrp1(newA());std::vect
在我的服务器(CentOS7.2)中安装依赖项:npminstall但我得到以下错误:npmERR!codeZ_BUF_ERRORnpmERR!errno-5npmERR!unexpectedendoffilenpmERR!Acompletelogofthisruncanbefoundin:npmERR!/root/.npm/_logs/2018-02-11T21_03_20_261Z-debug.log在/root/.npm/_logs/2018-02-11T21_03_20_261Z-debug.log中,信息如下:10234verbosebundleEBUNDLEOVERRIDE
我对boost.python还很陌生,并试图将函数的返回值公开给python。函数签名如下所示:std::unique_ptrsomeFunc(conststd::string&str)const;在python中调用函数时,出现如下错误:TypeError:Noto_python(by-value)converterfoundforC++type:std::unique_ptr>我在python中的函数调用如下所示:a=mymodule.MyClass()a.someFunc("somestringhere")#errorhere我试图公开std::unique_ptr但无法让它工作
我正在创建一个与某些WindowsAPI代码互操作的类,现在我必须初始化的指针之一是通过调用初始化它的native函数来完成的。我的指针是std::unique_ptr类型,带有一个自定义删除器,它调用提供的WinAPI删除器函数,但是我不能将带有&地址运算符的unique_ptr传递给init函数.为什么?我创建了一个示例来演示我的问题:#includestructfoo{intx;};structcustom_deleter{};voidinit_foo(foo**init){*init=newfoo();}intmain(){std::unique_ptrfoo_ptr;init
这是一个模板函数,它接受一个指针(或类似对象的指针)和一个成员函数:templateintexample(Ptrptr,MemberFunctorfunc){return(ptr->*func)();}如果与普通指针一起使用时有效:structC{intgetId()const{return1;}};C*c=newC;example(c,&C::getId);//Worksfine但它不适用于智能指针:std::shared_ptrc2(newC);example(c2,&C::getId);错误信息:error:C2296:'->*':illegal,leftoperandhasty
我已经阅读了大量关于应用程序中涉及智能指针时的性能问题的讨论。常见的建议之一是将智能指针作为const&而不是拷贝传递,如下所示:voiddoSomething(std::shared_ptro){}对voiddoSomething(conststd::shared_ptr&o){}但是,第二个变体实际上不是破坏了共享指针的目的吗?我们实际上在这里共享共享指针,因此如果由于某些原因指针在调用代码中被释放(考虑可重入性或副作用),则const指针将变为无效。共享指针实际上应该防止的情况。我知道const&节省了一些时间,因为不涉及复制,也没有锁定来管理引用计数。但代价是代码的安全性降低了