T *p = ::operator new(sizeof(T));
new (p) T;
字符串
我想知道这个语法是如何工作的,因为placement new被声明为:
void* operator new(std::size_t, void*)
型
第二个参数void*
似乎指向对象的存储,那么C如何将new (p) T
连接到void*
?
在gcc libsupc中,实现很简单:
// Default placement versions of operator new.
_GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
_GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
型
编译器是否负责将语法new(*T) T
转换为位置operator new
的调用?
2条答案
按热度按时间jyztefdp1#
编译器是否有责任将语法new(*T)T转换为对位置运算符new的调用?
是的,没错。
Placement
new
不能作为库函数实现,它需要编译器进行特殊处理。您在libsupc++源代码中看到的实际实现在这里可能会产生误导,因为placement new调用的大多数关键属性都没有在该实现中反映出来。yshpjwxd2#
使用正则
new
表达式可以做两件事:它调用分配内存的函数operator new
(但不构造),然后调用该位置的构造函数,在该内存中创建对象。对于placement new,
operator new(std::size_t, void*)
是一个无操作,只是返回传入的指针,然后编译器调用该位置的构造函数,在该内存中创建对象。字符串
您还可以创建自己的自定义
new
方法,这些方法也可以使用相同的通用机制。型