是的,它通常是安全的。 (对 Maxim Yegorushkin 对投掷边缘案例的观察表示赞同)
注意下面的错字信息
Boost 将解引用和->
运算符定义为
template<class T>
typename boost::detail::sp_dereference< T >::type boost::shared_ptr< T >::operator* () const;
template<class T>
typename boost::detail::sp_member_access< T >::type boost::shared_ptr< T >::operator-> () const;
当这些detail
位被解决时,你有这个
template<class T>
T & boost::shared_ptr< T >::operator* () const
template<class T>
T * boost::shared_ptr< T >::operator-> () const
因此,您正在直接处理指向的对象。没有代理或其他结构可能会干扰您的尝试。
就指向的数据而言,您的代码:
bigDataPtr->~BigDataPtr();
new (&*bigDataPtr) BigData;
可能有错别字。但是,如果您打算:
bigDataPtr->~BigData();
new (&*bigDataPtr) BigData;
它将解决
(BigData pointer)->~BigData();
new (&(BigData reference)) BigData;
这是合法的,你是正确的,它可以避免通常在分配中产生的额外分配。