我已经阅读了大量关于应用程序中涉及智能指针时的性能问题的讨论。常见的建议之一是将智能指针作为const&而不是拷贝传递,如下所示:voiddoSomething(std::shared_ptro){}对voiddoSomething(conststd::shared_ptr&o){}但是,第二个变体实际上不是破坏了共享指针的目的吗?我们实际上在这里共享共享指针,因此如果由于某些原因指针在调用代码中被释放(考虑可重入性或副作用),则const指针将变为无效。共享指针实际上应该防止的情况。我知道const&节省了一些时间,因为不涉及复制,也没有锁定来管理引用计数。但代价是代码的安全性降低了
我是shared_ptr的新手,我正在尝试找出.reset()函数的确切功能。#include#includeusingnamespacestd;classSomeClass{};intmain(){shared_ptrsp(nullptr);//dosomestuff,spnowhas10co-ownerscout会输出100所以自从我使用了重置功能后,所有实例都从内存中删除了吗?如,我刚刚用sp消除了任何可能的内存泄漏吗?显然这是我快速编造的一个玩具示例,如果有任何错误,请见谅。跟进情况:shared_ptrreturnThis(){shared_ptrsomeObject(new
我正在切换到GCC4.6.1,它开始提示在GCC4.4和MSVC10上运行良好的代码。从这样的函数返回时,它似乎不想在shared_ptr和bool之间进行转换:classClass{shared_ptrpointer_;};boolClass::Function()const{returnpointer_;}使用returnstatic_cast(pointer_);一切正常。到底他妈发生了什么?这是--std=cpp0x. 最佳答案 在C++11中,shared_ptr有一个explicitoperatorbool这意味着sha
我想从一个池中分配由shared_ptr管理的对象,比如Boost的Pool接口(interface),如何实现? 最佳答案 这是执行您想要的操作的代码(可能无法编译,因为我手头没有boost并且我正在从内存中编写它):classYourClass;//yourdatatype,definedsomewhereelseboost::object_poolallocator;voiddestroy(YourClass*pointer){allocator.destroy(pointer);}boost::shared_ptrcreat
在shared_ptr的boost实现中,它使用了relaxedmemoryorderingtoincrementitsreferencecount.这看起来很安全,因为减量使用获取/释放来确保在释放内存之前线程可以看到任何先前的减量。这个方法似乎是正确的,出现在HerbSutterstalkonatomics在libc++的实现中使用fullmemorybarrierstemplateinlineTincrement(T&t)_NOEXCEPT{return__sync_add_and_fetch(&t,1);}templateinlineTdecrement(T&t)_NOEXCE
在thebookTheC++StandardLibrary在第91页,我读过这篇关于shared_from_this()的文章:Theproblemisthatshared_ptrstoresitselfinaprivatememberofPerson’sbaseclass,enable_shared_from_this,attheendoftheconstructionofthePerson.书中相关代码片段为:classPerson:publicstd::enable_shared_from_this{...};这里有两点我不明白:这是谁shared_ptr哪个商店自己?如何在Pe
我使用reset()作为我的shared_pointer的默认值(相当于NULL)。但是如何检查shared_pointer是否为NULL?这会返回正确的值吗?boost::shared_ptrblah;blah.reset()if(blah==NULL){//Doesthischeckiftheobjectwasreset()?} 最佳答案 用途:if(!blah){//Thischecksiftheobjectwasreset()orneverinitialized} 关于c++-b
这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:Howtoreleasepointerfromboost::shared_ptr?我的接口(interface)的一个函数返回一个指向对象的指针。用户应该拥有该对象的所有权。我不想返回Boost.shared_ptr,因为我不想强制客户使用boost。但是,在内部,我想将指针存储在shared_ptr中,以防止出现异常等情况下的内存泄漏。似乎没有办法将指针与共享指针分离。这里有什么想法吗? 最佳答案 您正在寻找的是release函数;shared_ptr没
我必须在创建容器时在容器中注册一个对象。如果没有智能指针,我会使用这样的东西:a_class::a_class(){register_somewhere(this);}使用智能指针我应该使用shared_from_this但我不能在构造函数中使用它。有没有干净的方法来解决这个问题?在类似的情况下你会怎么做?我正在考虑引入一个init方法,以便在创建后立即调用并将所有内容放入工厂函数中,如下所示:boost::shared_ptrcreate_a(){boost::shared_ptrptr(newa_class);ptr->init();returnptr;}在这种情况下可以遵循标准程
std::shared_ptr::unique()的技术问题是什么导致它在C++17中被弃用?根据cppreference.com,std::shared_ptr::unique()在C++17中被弃用为thisfunctionisdeprecatedasofC++17becauseuse_countisonlyanapproximationinmulti-threadedenvironment.我理解这对于use_count()>1是正确的:当我持有对它的引用时,其他人可能同时放开他的引用或创建一个新拷贝。但如果use_count()返回1(这是我在调用unique()时感兴趣的内容