new和:: new有什么区别

tej*_*jas 29 c++

许多图书馆喜欢使用::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运算符.

  • 全局放置new,与应用程序无法替代,不像其他全局函数(谢天谢地).这基本上是对黑暗艺术的防御. (10认同)
  • @EduardRostomyan No:`new X`更喜欢在`class X`本身中定义的`operator new`函数,或者`X`的基类或包含`X`的命名空间.`:: new X`只使用全局`:: operator new`函数. (4认同)
  • @EduardRostomyan:绝对是! (3认同)

Sit*_*esh 6

通常,只要::在LHS使用范围resolution()运算符而没有任何说明符,它就会引用全局范围.这也是一样的.

来到运营商new,它可以在本地和外部范围内过载.因此,使用全局变体范围解析运算符.