gpt4 book ai didi

C++ "placement new"错综复杂

转载 作者:行者123 更新时间:2023-11-30 05:09:21 24 4
gpt4 key购买 nike

我一直在阅读一些关于 placement new on SO 的问题,我发现了一些不同的使用方法,我想我会在这里问一下。我知道 placement new 基本上是您创建对象并在您选择的已分配内存中为其指定特定位置的一种方式;我只是不明白所有的复杂性。

First one我在 SO 上看到使用了这个例子(来自 C++ Primer):

const int BUF = 512;
const int N = 5;
char buffer[BUF];
double * pd1;
pd1 = new (buffer) double[N];

Second one我在 SO 上看到使用这个例子(来自 C++ Primer Plus):

char * buffer = new char[BUF];   //get a block of memory
JustTesting *pc1, *pc2;

pc1 = new (buffer) JustTesting; //Place object in buffer

这两者之间的主要区别在于,在第一段代码中,buffer 是一个字符数组,而在第二个示例中,它是一个指向字符数组的指针,但两个代码块都包含新(缓冲区)

我的第一个问题是:在这种情况下使用 placement new 时,它可以接受一个对象还是它的地址,如果可以,哪个是首选?

我也见过没有左值的 placement new。见下文。

new(&myObject) myClass;

我的第二个问题是:有左值和没有左值的 placement new 之间有什么区别?

最佳答案

I understand that placement new is basically a way for you to create an object and give it a certain place in memory of your choice that has already been allocated;

不完全是。

new expression调用对应的operator new然后调用构造函数。请注意,这是两个名称相似的不同事物。

Placement new 表达式跳过分配内存,只调用构造函数。这是通过使用放置 void* operator new( std::size_t count, void* ptr) 来实现的, 它不执行任何操作并返回 ptr

您的工作是在使用 placement new 时为正在初始化的对象提供存储空间。

关于C++ "placement new"错综复杂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com