static_pointer_cast 是否更新引用计数
Does static_pointer_cast update reference counting
我最近发现了关于替换的信息:
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 );
后者是一个aliasing constructor,意思是对象由r管理,而构造的shared_ptr是非管理的。要在没有 static_cast_pointer 的情况下具有相同的行为,则必须编写
std::shared_ptr<T>(r, static_cast<T>(odl_ptr.get());
您的 old_ptr 属于其他类型。
一些代码来自here
我最近发现了关于替换的信息:
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 );
后者是一个aliasing constructor,意思是对象由r管理,而构造的shared_ptr是非管理的。要在没有 static_cast_pointer 的情况下具有相同的行为,则必须编写
std::shared_ptr<T>(r, static_cast<T>(odl_ptr.get());
您的 old_ptr 属于其他类型。
一些代码来自here