Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++&引用;“新安置”;错综复杂_C++_Placement New - Fatal编程技术网

C++ C++&引用;“新安置”;错综复杂

C++ C++&引用;“新安置”;错综复杂,c++,placement-new,C++,Placement New,我一直在读一些关于新位置的问题,我正在寻找一些不同的方法来使用它,我想我会在这里问一下。我知道placement new基本上是你创建一个对象并在你选择的内存中给它一个已经分配好的位置的一种方法;我只是不明白所有的复杂之处 我看到了这样使用这个例子(来自C++入门): 我看到了这样使用这个例子(从C++ +引物+): 这两者之间的主要区别在于,在第一个代码块中,buffer是一个字符数组,在第二个示例中,它是一个指向字符数组的指针,但两个代码块都包含new(buffer) 我的第一个问题是:在这

我一直在读一些关于新位置的问题,我正在寻找一些不同的方法来使用它,我想我会在这里问一下。我知道placement new基本上是你创建一个对象并在你选择的内存中给它一个已经分配好的位置的一种方法;我只是不明白所有的复杂之处

我看到了这样使用这个例子(来自C++入门):

我看到了这样使用这个例子(从C++ +引物+):

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

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

我也看到过没有左值的新位置。见下文

new(&myObject) myClass;
我的第二个问题是:有左值和没有左值的新位置之间有什么区别

我知道placement new基本上是你创建一个对象并在你选择的内存中给它一个已经分配好的位置的一种方法

不完全是

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

Placement
new
表达式跳过分配内存,只调用构造函数。这是通过使用placement来实现的,placement不执行任何操作并返回
ptr


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

您的第一个问题已经得到回答。对于你的第二个问题-有左值和没有左值的新位置之间有什么区别

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

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

数组变量衰减为指向第一个元素的指针,因此,尽管您的两个示例看起来不同,但实际上都在使用指针。您可能需要更好地理解指针和数组之间的关系-两个示例都在使用指针。@Mark Ransom哦,没想到这么简单。谢谢,这回答了我的第一个问题。
new expression
operator new
是不同的。也可以提到这是第三个独立的东西。@MooningDuck根据我之前的理解和该链接的公认答案,
new
操作符与
new
表达式是相同的东西,调用
运算符new
和构造函数。有一个
新表达式
涉及调用相应的
运算符new
。您可以直接呼叫
操作员new
。这里只有两件事。@MaximEgorushkin好的,谢谢你的解释,但是有左值和没有左值的位置有什么区别呢?@Peter在这两种情况下都调用
void*操作符new(std::size\u t count,void*ptr)
,因此没有区别(除非有用户定义的
操作符new
重载)。
new(&myObject) myClass;
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
    {   // construct array with placement at _Where
    return (_Where);
    }