C++ new和::new之间有什么区别
许多像boost这样的库使用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* >
::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>为您分配内存,但是放置新的内存需要一些已经有效的区域。”对任何用户定义的globaloperator new
替换进行检查,以确保其基本保持正常。如果不遵守这些检查,则表示您有未定义的行为。可能存在重复的