new和::new有什么区别

What is the difference between new and ::new

本文关键字:new 区别 什么      更新时间:2023-10-16

许多库喜欢 boost 使用::new::delete.

boost::make_shared的例子

template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}

这是什么意思?为什么人们会使用::new而不是新的?

C可以定义自己的operator new(例如,这样就可以为该类制定自己的分配策略,和/或为其提供一些分配器。许多标准容器模板接受可选的分配器参数,例如要std::vector的第二个参数;另请参阅std::allocator和此示例)。

如果编写new C的代码,则将使用该运算符(如果存在)。

如果编码::new C,则使用全局new

您的示例使用的是全局放置new

newnew[]deletedelete[](包括放置变体)在class全局范围内都是可覆盖的,尽管这样做是不明智的。

当您看到::new时,您正在使用全局new运算符。

一般来说,每当在LHS使用范围分辨率(::)运算符时,它指的是全局范围。这里也是一样的。

来到运算符new,它可以在本地和外部范围内重载。因此,使用全局变体范围解析运算符进行访问。

new可以被覆盖和替换。 因此,简单地说明new并不总是能得到你想要的new

在这种特定情况下,我们正在研究新的展示位置:

void * pv = pd->address();
::new( pv ) T( boost::detail::sp_forward<Args>( args )... );

这是我们尝试在位置pv中构建T的地方。

为了避免new的覆盖被调用而不是"真实"放置new的可能性,你必须使用::new( void pointer here ) type( arguments... );。 该特定new既不能被替换,也不能被推翻。

普通的新运算符在类规模上实现,可以覆盖,而 ::new 是全局范围实现的,不能被覆盖。