草庐IT

libgnuSTL_shared

全部标签

c++ - 将 shared_ptr 隐藏在 typedef 后面是一种好的风格吗?

我想减少代码中的一些视觉噪音并将shared_ptr隐藏在typedef后面,如下所示:typedefboost::shared_ptrSomeLongClassPtr;所以这个:voidfoo(constboost::shared_ptr&a,boost::shared_ptr&b);变成这样:voidfoo(constSomeLongClassPtr&a,SomeLongClassPtr&b);另一方面,我担心我会降低代码的明确性。哪种风格更好? 最佳答案 鉴于std::string本身就是一个typedef,我认为你很好。我自

c++ - shared_dynamic_cast 和 dynamic_pointer_cast 的区别

谁能给我解释一下:shared_dynamic_cast和dynamic_pointer_cast来自Boost库?在我看来它们可能是等价的。 最佳答案 给定一个shared_ptr,这两个函数确实是等价的。区别在于shared_dynamic_cast仅适用于shared_ptr的,而dynamic_pointer_cast适用于任何类型的指针(通过重载)。这使您可以对任何指针concept执行动态转换,而不管该指针实际上是如何构成的:#include#includestructfoo{};structbar:foo{voidf(

c++ - enable_shared_from_this - 空的内部弱指针?

我正在使用enable_shared_from_this然后从Base继承.尝试使用shared_from_this()时在Derived的构造函数(不是初始化列表),我得到一个异常。原来内部弱指针为空,并不指向this一点也不。这怎么可能发生?我的另一个用例完全可以正常工作。我什至不知道从哪里开始。我低头看了enable_shared_from_this的源码,在我看来,该指针始终为nullptr。 最佳答案 您不能在对象的构造函数中调用shared_from_this()。shared_from_this()要求对象由至少一个s

c++ - std::weak_ptrs 是否会影响 std::make_shared 分配的内存何时被释放?

如果我调用std::make_shared(而不仅仅是显式分配shared_ptr)那么出于性能原因,我希望引用计数与T的实例一起分配在内存中。一切顺利。但如果我有weak_ptr引用同一个对象的实例,大概他们需要访问该引用计数,以了解该对象是否仍然存在。因此,当T的实例的最后一个shared_ptr被销毁时,对系统的幼稚理解会暗示它无法释放存储T的内存,因为weak_ptrs仍然需要访问该计数。好像有一个separateweakreferencecounter从理论上讲,它可以与T的实例分开保存,以便可以在弱引用仍然存在的情况下销毁T并释放内存。但随后我们又回到了2个单独的分配,从而

c++ - 为什么在c++14中定义了shared_timed_mutex,而在c++17中定义了shared_mutex?

C++11引入了std::mutex及其扩展版本-std::timed_mutex。但是,在c++14中,我们有std::shared_timed_mutex,但它的“父级”std::shared_mutex将在c+中添加+17。对此有什么合理的解释吗?如果我不打算使用std::shared_timed_mutex的“定时”功能,它会比建议的std::shared_mutex更糟(更慢,消耗更多资源)吗?? 最佳答案 Sharedmutex原来是有计时的,叫做shared_mutex。实现者(msvciirc)指出,他们可以在没有时

c++ - 我应该使用 std::shared 指针来传递指针吗?

假设我有一个由std::unique_ptr管理的对象。我的代码的其他部分需要访问这个对象。传递指针的正确解决方案是什么?我应该只通过std::unique_ptr::get传递普通指针,还是应该使用并传递std::shared_ptr而不是std::unique_ptr?我对std::unique_ptr有一些偏好,因为该指针的所有者实际上负责清理。如果我使用共享指针,即使对象实际上应该被销毁,也有可能由于共享指针而保持事件状态。编辑:不幸的是,我忘了提到指针不仅是函数调用的参数,而且会存储在其他对象中以构建对象的网络结构。我不喜欢共享指针,因为这样就不再清楚,谁实际拥有该对象。

c++ - 使用 shared_ptr 时如何检测循环

shared_ptr是Boost库中的引用计数智能指针。引用计数的问题在于它不能处理循环。我想知道如何在C++中解决这个问题。请不要提出诸如“不要循环”或“使用weak_ptr”之类的建议。编辑我不喜欢只使用weak_ptr的建议,因为显然如果你知道你会创建一个循环,那么你就不会有问题。如果您在运行时生成shared_ptrs,您也无法知道在编译时会有一个循环。因此,请自行删除其中使用weak_ptr的答案,因为我特别要求不要提供此类答案... 最佳答案 shared_ptr表示所有权关系。而weak_ptr代表awareness。

c++ - 当在 std::list<shared_ptr> 的 C++14 初始化列表中间抛出时,GCC(但不是 Clang)下的内存泄漏

考虑以下程序:#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

c++ - shared_ptr 如何提供 noexcept 分配?

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。除非

c++ - std::make_shared 是否执行值初始化(GCC 和 clang 不同意)?

我的意思可以用下面的例子来解释:autop=std::make_shared();是int变量默认初始化(因此具有垃圾值)或值初始化(因此具有零值)?我已经在GCC5.2和clang3.6上进行了测试,前者进行值初始化,后者进行默认初始化。我想知道标准对此有何规定?在我看来,现代C++在这种情况下绝对应该执行值初始化。 最佳答案 是的。N379720.8.2.2.6AllocatesmemorysuitableforanobjectoftypeTandconstructsanobjectinthatmemoryviatheplace