首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是新的安置?

什么是新的安置?
EN

Stack Overflow用户
提问于 2021-06-13 22:50:03
回答 1查看 214关注 0票数 2

我有一些关于安置new的问题

代码语言:javascript
复制
int x;
int* p = new(&x) int{10};
std::cout << x; // 10

  • 当我们说放置new时,指的是new表达式还是操作符new (函数)?

空*运算符新(std::size_t,void*。//这是新的安置吗?

我太困惑了!有时我会找到“新操作员”,其他时候我会发现“新操作员”?!

有时,我会发现操作符的过载--新功能称为“新位置”:

代码语言:javascript
复制
   void* operator new(std::size_t, void*, int) // placement new?

下面是另一个例子:

代码语言:javascript
复制
    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;

  • ,即使第一个参数不是指针,这是否是新的位置?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-14 01:42:04

什么是安置新的?

它将一个动态对象构造到所提供的存储区域。

当我们说新位置时,我们指的是新表达式吗?

是的,但特别是一个新的表达式,其中的布局参数没有被省略。

"Placement语法“也用来指这一点。

或运算符新(函数)?

...also是的,虽然可能不那么频繁。这取决于背景。在将对象初始化为运算符返回的地址之前,新表达式将调用其中一个新运算符。放置新表达式调用新的放置运算符。

标准放置运算符new不执行任何操作,并将指针参数返回不变。

示例:

下面是一个新表达式,其中省略了放置新参数。这将分配存储空间(将调用非位置操作符new ),并在该存储中创建一个对象。

代码语言:javascript
复制
T* p1 = new T();
//         ^ no placement parameter
delete p1; // don't forget to clean up

下面不是一个新的表达式,而是对非位置全局操作符的调用。

代码语言:javascript
复制
void* storage = ::operator new(sizeof(T), alignof(T));

下面是一个带有布局参数的新表达式。这是“安置新”。它在不分配存储的情况下创建对象。

代码语言:javascript
复制
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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67963188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档