Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ new和::new之间有什么区别_C++ - Fatal编程技术网

C++ new和::new之间有什么区别

C++ new和::new之间有什么区别,c++,C++,许多像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* >

许多像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 );
}
模板typename boost::detail::sp_if_not_array::键入make_shared(Args&&…Args)
{
boost::共享ptrpt(静态强制转换(0),boost\u SP\u MSD(T));
boost::detail::sp_ms_deleter*pd=static_cast*>(pt._internal_get_untyped_deleter());
void*pv=pd->address();
::新(pv)T(boost::detail::sp_forward(args)…);
pd->set_initialized();
T*pt2=静态铸件(pv);
boost::detail::sp_启用_共享_来自此(&pt,pt2,pt2);
返回升压::共享(pt,pt2);
}

这是什么意思?为什么要使用
::new
而不仅仅是new?

new
new[]
delete
delete[]
(包括放置变体)在
类和全局范围都是可以覆盖的,尽管这样做是不明智的


当您看到
::new
时,您使用的是全局
new
操作符。

C
可以定义自己的(例如,这使您能够为该类拥有自己的分配策略,和/或为其提供一些。许多标准模板接受可选的分配器参数,例如第二个参数to;另请参见和示例)

如果您对新C
进行编码,则将使用该运算符(如果存在)

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


您的示例通常使用全局

只要在LHS使用范围解析(
)运算符而不使用任何说明符,它就引用全局范围。这里也是一样的


对于操作符
new
,它可以在本地和外部作用域重载。因此,可以使用访问全局变量作用域解析操作符。

new
可以被覆盖和替换。因此,简单地声明
new
并不总能获得所需的
new

在这一具体案例中,我们正在研究新的布局:

void * pv = pd->address();

::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
void*pv=pd->address();
::新(pv)T(boost::detail::sp_forward(args)…);
这就是我们试图在位置
pv
中构建
T
的地方


为避免调用
new
的重写而不是“真实”位置
new
,必须使用
::new(此处为空指针)类型(参数…)
。特定的
new
既不能被替换也不能被重写。

普通的new操作符是在类范围内实现的,可以被重写,而::new是在全局范围内实现的,不能被重写。

全局放置new,与其他全局函数不同,它不能被应用程序替换(谢天谢地)。这本质上是对黑魔法的防御。在全局范围内使用new和::new时是否相同?@EduardRostomyan:绝对!@EduardRostomyan No:
new X
更喜欢
操作符new
函数,或者
类X
的基类或包含
X
的命名空间::nEW X/C++代码只使用全局<代码>::运算符new < /Cuff>函数。它可以吗?实际上,它通常可以——大多数C++运行时提供静态库,而C++不阻止定义自己的全局运算符new。您可以在大多数时间内有效地替换内置的实现。最后一段听起来像(通常的
void*
)放置new是对“原始代码<新代码/代码>替换的一种替换,只是为了避免使用不同的或可替换的<代码>操作符new < /Cord>,但是它们有相当不同的行为:Apple < C++ > new < /Cord>为您分配内存,但是放置新的内存需要一些已经有效的区域。”对任何用户定义的global
operator new
替换进行检查,以确保其基本保持正常。如果不遵守这些检查,则表示您有未定义的行为。可能存在重复的