new和::new有什么区别
What is the difference between new and ::new
许多库喜欢 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
new
、new[]
、delete
和delete[]
(包括放置变体)在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 是全局范围实现的,不能被覆盖。
相关文章:
- 'new'和'='与指针的区别
- new和::new有什么区别
- 带"new"的指针和带"&variable"的指针有什么区别
- new _Elem[_Size]() 与 new _Elem[_Size]{} 有什么区别?
- int '*p = new int (5);' 和 'int *p = new int[5];' 有什么区别?
- (类 *对象;)和(object = new class();)之间有什么区别
- 作为参数的"new Foo()"和"&Foo()"之间的区别
- 新的int()和new int []有什么区别
- "char *"和"char * = new char[]"之间的C++区别
- C++ push_back(*new obj()) 和 push_back(obj()))有什么区别?
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- new/delete 和 ::new/::d elete 有什么区别?
- "new"运算符和"new"函数的区别
- "int *a = new int"和"int *a = new int [5]"有什么区别?
- 在分配器中使用new函数和*alloc函数时,它们之间有区别吗
- c++中new操作符与java中new操作符的区别
- 重载运算符 new 和运算符 new[] 在 C++ 中有什么区别?
- 'new()' int和'int *p'有什么区别
- 全局非抛出 ::运算符 new 和 std::malloc 之间的区别
- 直接声明变量和使用关键字new有什么区别