C ++“放置新的”错综复杂

时间:2017-09-15 16:36:57

标签: c++ placement-new

我一直在阅读关于在SO上放置新内容的一些问题,我发现了一些不同的使用方法,我想我会在这里问一下。我理解放置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是一个char数组,在第二个示例中,它是一个指向char数组的指针,但两个代码块都包含{{1 }}

我的第一个问题是:在此上下文中使用placement new时,它是否可以接受对象或其地址,如果是,则首选?

我还看过没有左值的新贴牌。见下文。

new (buffer)

我的第二个问题是:放置新款与没有左值之间有什么区别?

2 个答案:

答案 0 :(得分:1)

  

我理解放置new基本上是一种创建对象的方法,并在已经分配的内存中为它提供一个特定的位置;

不完全是。

new expression调用相应的operator new,然后调用构造函数。请注意,这两个命名方式相似。

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

使用展示位置新功能时,您需要为正在初始化的对象提供存储空间。

答案 1 :(得分:0)

您的第一个问题已经回答了。对于你的第二个问题 - 放置新的与没有左值的区别有什么区别?

由于placement new返回在其第二个参数中传递的地址,因此需要左值来存储该地址是可选的。请参阅以下Microsoft Visual Studio中的放置新实现 -

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
    {   // construct array with placement at _Where
    return (_Where);
    }