static_pointer_cast是否更新引用计数

时间:2015-10-25 18:34:13

标签: c++ shared-ptr

我最近发现有关更换的内容:

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

std::static_pointer_cast<NEWT>(odl_ptr);

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

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

1 个答案:

答案 0 :(得分:3)

使用static_pointer_cast或dynamic_pointer_cast可以使生成的shared_ptr执行正确的引用计数,而不会导致双重删除。这是通过为生成的转换指针调用特殊构造函数来实现的,这是一个示例实现:

// specify the order_id so WooCommerce knows which to update
$order_data = array(
    'order_id' => $order_id,
    'customer_note' => 'The customer note.'
);
// update the customer_note on the order
wc_update_order( $order_data );

请注意,调用的构造函数是

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);

后者是别名构造函数,这意味着该对象由r管理,并且构造的shared_ptr是非管理的。要在没有static_cast_pointer的情况下具有相同的行为,必须编写

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

你的old_ptr属于其他类型。

here

中的一些代码