许多图书馆喜欢使用::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 );
}
Run Code Online (Sandbox Code Playgroud)
这是什么意思?为什么一个人会使用::new
新的?
Bas*_*tch 42
一个类C
可以自己定义operator new
(例如,这可以为该类创建自己的分配策略,和/或为它提供一些分配器.许多标准容器模板接受可选的allocator参数,例如第二个参数std::vector
;另见std::allocator
和这个例子).
如果您编码new C
,将使用该运算符(如果存在).
如果您编码::new C
,new
则使用全局
您的示例是使用全局展示位置new
Bat*_*eba 21
new
,new[]
,delete
,和delete[]
(包括安置变种)是重写都在class
和在全球范围内,尽管这样后者是不明智的.
当您看到时::new
,您正在使用全局new
运算符.
通常,只要::
在LHS使用范围resolution()运算符而没有任何说明符,它就会引用全局范围.这也是一样的.
来到运营商new
,它可以在本地和外部范围内过载.因此,使用全局变体范围解析运算符.