草庐IT

Make_shared

全部标签

c++ - 传递 const shared_ptr<T>& 而不是 shared_ptr<T> 作为参数

我已经阅读了大量关于应用程序中涉及智能指针时的性能问题的讨论。常见的建议之一是将智能指针作为const&而不是拷贝传递,如下所示:voiddoSomething(std::shared_ptro){}对voiddoSomething(conststd::shared_ptr&o){}但是,第二个变体实际上不是破坏了共享指针的目的吗?我们实际上在这里共享共享指针,因此如果由于某些原因指针在调用代码中被释放(考虑可重入性或副作用),则const指针将变为无效。共享指针实际上应该防止的情况。我知道const&节省了一些时间,因为不涉及复制,也没有锁定来管理引用计数。但代价是代码的安全性降低了

c++ - 在 std::shared_ptr 上使用 .reset() 是否会删除所有实例

我是shared_ptr的新手,我正在尝试找出.reset()函数的确切功能。#include#includeusingnamespacestd;classSomeClass{};intmain(){shared_ptrsp(nullptr);//dosomestuff,spnowhas10co-ownerscout会输出100所以自从我使用了重置功能后,所有实例都从内存中删除了吗?如,我刚刚用sp消除了任何可能的内存泄漏吗?显然这是我快速编造的一个玩具示例,如果有任何错误,请见谅。跟进情况:shared_ptrreturnThis(){shared_ptrsomeObject(new

c++ - GCC 错误 : cannot convert 'const shared_ptr<...>' to 'bool' in return

我正在切换到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

c++ - 为什么 std::make_unique 而不是 std::unique_ptr::make?

为什么C++采用自由函数:std::make_unique(...);std::make_shared(...);而不是使用静态成员函数:std::unique_ptr::make(...);//staticstd::shared_ptr::make(...);//static? 最佳答案 TL;DR:静态成员函数始终可以访问私有(private)数据,但自由函数只有在明确标记为friend时才能访问私有(private)数据。选择将这些函数实现为自由函数(有一小部分实现为友元函数)不是随机的历史产物,而是一个经过深思熟虑的决定,以

c++ - 带有 boost shared_ptr 的自定义(池)分配器

我想从一个池中分配由shared_ptr管理的对象,比如Boost的Pool接口(interface),如何实现? 最佳答案 这是执行您想要的操作的代码(可能无法编译,因为我手头没有boost并且我正在从内存中编写它):classYourClass;//yourdatatype,definedsomewhereelseboost::object_poolallocator;voiddestroy(YourClass*pointer){allocator.destroy(pointer);}boost::shared_ptrcreat

c++ - Pimpl - 为什么可以在不完整的类型上调用 make_unique

为什么make_unique调用会编译?make_unqiue不要求它的模板参数是一个完整的类型吗?structF;intmain(){std::make_unique();}structF{};问题源于我的PIMPL实现的“问题”:我确实理解为什么必须在实现类(PIMPL)的cpp文件中由用户声明和定义析构函数。但是移动包含pimpl-的类的构造函数仍然可以编译。classObject{};classCachedObjectFactory{public:CachedObjectFactory();~CachedObjectFactory();std::shared_ptrcreate

c++ - 为什么不允许使用 `make_unique<T[N]>`?

假设命名空间std贯穿始终。C++14委员会草案N3690定义std::make_unique因此:[n3690:20.9.1.4]:unique_ptrcreation   [unique.ptr.create]templateunique_ptrmake_unique(Args&&...args);1Remarks:ThisfunctionshallnotparticipateinoverloadresolutionunlessTisnotanarray.2Returns:unique_ptr(newT(std::forward(args)...)).templateunique_

c++ - 为什么 libc++ 的 shared_ptr 实现使用完整的内存屏障而不是放松的?

在shared_ptr的boost实现中,它使用了relaxedmemoryorderingtoincrementitsreferencecount.这看起来很安全,因为减量使用获取/释放来确保在释放内存之前线程可以看到任何先前的减量。这个方法似乎是正确的,出现在HerbSutterstalkonatomics在libc++的实现中使用fullmemorybarrierstemplateinlineTincrement(T&t)_NOEXCEPT{return__sync_add_and_fetch(&t,1);}templateinlineTdecrement(T&t)_NOEXCE

c++ - 从技术角度来看,为什么 shared_from_this 不能在构造函数中使用?

在thebookTheC++StandardLibrary在第91页,我读过这篇关于shared_from_this()的文章:Theproblemisthatshared_ptrstoresitselfinaprivatememberofPerson’sbaseclass,enable_shared_from_this,attheendoftheconstructionofthePerson.书中相关代码片段为:classPerson:publicstd::enable_shared_from_this{...};这里有两点我不明白:这是谁shared_ptr哪个商店自己?如何在Pe

c++ - 我应该什么时候使用 make_heap 与优先队列?

我有一个要用来创建堆的vector。我不确定是否应该使用C++make_heap函数或将vector放入优先级队列?在性能方面哪个更好?我应该什么时候使用一个与另一个? 最佳答案 在性能方面没有区别。std::priority_queue只是一个适配器类,它将容器和与堆相关的相同函数调用包装到一个类中。std::priority_queue的规范公开声明。通过从暴露的std::vector构建heap并直接调用与堆相关的函数,您可以保持它对外部访问的可能性保持开放,这可能会损坏堆/队列的完整性。std::priority_queue