为什么C++采用自由函数:std::make_unique(...);std::make_shared(...);而不是使用静态成员函数:std::unique_ptr::make(...);//staticstd::shared_ptr::make(...);//static? 最佳答案 TL;DR:静态成员函数始终可以访问私有(private)数据,但自由函数只有在明确标记为friend时才能访问私有(private)数据。选择将这些函数实现为自由函数(有一小部分实现为友元函数)不是随机的历史产物,而是一个经过深思熟虑的决定,以
我想知道为什么编译时会出错:conststd::unique_ptrget(){returnstd::make_unique(10);}intmain(){conststd::unique_ptrvalue=get();returnEXIT_SUCCESS;}我收到以下错误:main.cpp:Infunction‘intmain()’:main.cpp:10:44:error:useofdeletedfunction‘std::unique_ptr::unique_ptr(conststd::unique_ptr&)[with_Tp=int;_Dp=std::default_delet
我想从一个池中分配由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
我以这种方式在lambda表达式中捕获unique_ptr:autostr=make_unique("mystring");autolambda=[capturedStr=std::move(str)]{cout在我尝试将capturedStr移动到另一个unique_ptr之前,它工作得很好。例如,以下内容不起作用:autostr=make_unique("mystring");autolambda=[capturedStr=std::move(str)]{cout这是编译器的输出:.../test/main.cpp:11:14:error:calltoimplicitly-dele
这个问题在这里已经有了答案:关闭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()时感兴趣的内容