我最近发现了关于更换:

std::shared_ptr<NEWT>(static_cast<NEWT>(old_ptr.get()));


std::static_pointer_cast<NEWT>(odl_ptr);

我知道如果不小心,前一种解决方案可能会导致双重删除。

我想知道是否使用后一种解决方案更新了引用计数,这是如何实现的?

最佳答案

使用 static_pointer_cast 或 dynamic_pointer_cast 使生成的 shared_ptr 能够对 进行适当的引用计数 而不会导致双重删除。这是通过为生成的强制转换指针调用特殊构造函数来实现的,这是一个示例实现:

template< class T, class U >
std::shared_ptr<T> static_pointer_cast( const std::shared_ptr<U>& r ) noexcept
{
    auto p = static_cast<typename std::shared_ptr<T>::element_type*>(r.get());
    return std::shared_ptr<T>(r, p);
}

请注意,调用的构造函数是
std::shared_ptr<T>(r,p);

这实际上是形式
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

后者是别名构造函数,意思是对象由r管理,构造的shared_ptr是非托管的。要在没有 static_cast_pointer 的情况下具有相同的行为,必须编写
std::shared_ptr<T>(r, static_cast<T>(odl_ptr.get());

您的 old_ptr 是其他类型的。

来自 here 的一些代码

关于c++ - static_pointer_cast 是否更新引用计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33333435/

10-11 15:12