我有一些关于安置new的问题
int x;
int* p = new(&x) int{10};
std::cout << x; // 10new时,指的是new表达式还是操作符new (函数)?空*运算符新(std::size_t,void*。//这是新的安置吗?
我太困惑了!有时我会找到“新操作员”,其他时候我会发现“新操作员”?!
有时,我会发现操作符的过载--新功能称为“新位置”:
void* operator new(std::size_t, void*, int) // placement new?下面是另一个例子:
void* operator new(std::size_t, std::size_t){
std::cout << "operator new(std::size_t, std::size_t)\n";
return nullptr;
}
int* p = new(5u)int;发布于 2021-06-14 01:42:04
什么是安置新的?
它将一个动态对象构造到所提供的存储区域。
当我们说新位置时,我们指的是新表达式吗?
是的,但特别是一个新的表达式,其中的布局参数没有被省略。
"Placement语法“也用来指这一点。
或运算符新(函数)?
...also是的,虽然可能不那么频繁。这取决于背景。在将对象初始化为运算符返回的地址之前,新表达式将调用其中一个新运算符。放置新表达式调用新的放置运算符。
标准放置运算符new不执行任何操作,并将指针参数返回不变。
示例:
下面是一个新表达式,其中省略了放置新参数。这将分配存储空间(将调用非位置操作符new ),并在该存储中创建一个对象。
T* p1 = new T();
// ^ no placement parameter
delete p1; // don't forget to clean up下面不是一个新的表达式,而是对非位置全局操作符的调用。
void* storage = ::operator new(sizeof(T), alignof(T));下面是一个带有布局参数的新表达式。这是“安置新”。它在不分配存储的情况下创建对象。
T* p2 = new (storage) T(); // must include <new>
// ^^^^^^^^^ placement parameter
p2->~T(); // don't forget to clean up
::operator delete(storage);注意:放置new并不一定要将对象构造为动态分配的内存。
从C++11开始,std::allocator_traits<std::allocator>::construct可以代替新的放置,因为C++20有std::construct_at。与新的安置不同的是,这些替代方案都是不变的(自C++20以来)。
,这是一个新的位置,即使第一个参数不是指针?
是的,不管布局参数的类型如何,new(5u)int仍然是一个布局新表达式。
除了void*之外,没有标准的放置操作符新接受任何东西,但是用户定义的新放置运算符(如问题中所示的一个)将允许使用这样的表达式。
这是该语言的一个相当模糊的特点。我从没见过这个在实践中使用过。
显示的操作符new实际上是坏的,因为它返回null。
https://stackoverflow.com/questions/67963188
复制相似问题