C++ "placement new" 错综复杂

C++ "placement new" intricacies

我一直在阅读有关 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];

我在 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 是一个字符数组,而在第二个示例中,它是一个指向字符数组的指针,但两个代码块都包含 new (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 calls the corresponding operator new 然后调用构造函数。请注意,这是两个名称相似的不同事物。

Placement new 表达式跳过分配内存,仅调用构造函数。这是通过使用什么都不做的放置 void* operator new( std::size_t count, void* ptr) 和 returns ptr.

来实现的

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

您的第一个问题已经得到解答。对于您的第二个问题 - 有左值和没有左值的 placement new 之间有什么区别?

由于放置新的 returns 在其第二个参数中传递的地址,需要一个左值来存储该地址是可选的。请参阅下面来自 Microsoft Visual Studio-

的展示位置新实现
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
    {   // construct array with placement at _Where
    return (_Where);
    }