我希望在某个时候使用 boost::log
,但是我无法将 std::shared_ptr
作为参数传递,因为编译器(VS2010)不能将其转换为 boost::shared_ptr
。
我不太喜欢它们彼此之间是外来的事实。
是否有一种安全和透明的方法将它们相互转换,以便它们不会互相干扰?
我不认为这是 这个问题 的重复,该问题指出两者是相同的。
我希望在某个时候使用 boost::log
,但是我无法将 std::shared_ptr
作为参数传递,因为编译器(VS2010)不能将其转换为 boost::shared_ptr
。
我不太喜欢它们彼此之间是外来的事实。
是否有一种安全和透明的方法将它们相互转换,以便它们不会互相干扰?
我不认为这是 这个问题 的重复,该问题指出两者是相同的。
template<typename T>
boost::shared_ptr<T> make_shared_ptr(std::shared_ptr<T>& ptr)
{
return boost::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}
template<typename T>
std::shared_ptr<T> make_shared_ptr(boost::shared_ptr<T>& ptr)
{
return std::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}
ptr
的副本(因此也保留了一个额外的引用计数)。我必须承认,我花了一段时间来理解这个技巧。 - Christian Rauboost::shared_ptr
中的lambda删除器被存储为其成员,并且由于按值捕获,它又拥有了std::shared_ptr
的副本作为成员,从而增加了原始对象的引用计数。因此,每个boost::shared_ptr
通过其删除器成员增加了原始对象的引用计数。但是当boost::shared_ptr
的引用计数(它实际上独立于std
的引用计数)达到0时,什么也不会被删除,因为删除器是一个空操作,但是删除器的销毁实际上会减少原始引用计数。 - Christian Rauweak_ptr
的情况下,将调用删除器,但什么也不会发生。只要还有至少一个weak_ptr
,对象的生命周期就会因删除器中的引用而被人为延长,从而破坏了weak_ptr
/ shared_ptr
组合的语义。修复很简单,设计很好,只需要改变实现方式:[ptr](T*){ptr.reset();}
- David Rodríguez - dribeas
std::array
和boost::array
之间进行转换。 - Marshall Clowstd::shared_ptr
和boost::shared_ptr
(以及std::array
和boost::array
)的情况下,也许可以使用reinterpret_cast
吗? - alfCboost/shared_ptr.hpp
的内容替换为类似于#include <memory> namespace boost { using shared_ptr = std::shared_ptr
这样的东西呢? - fghj