我一直在阅读关于在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)
我的第二个问题是:放置新款与没有左值之间有什么区别?
答案 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);
}