#define __PLACEMENT_NEW_INLINE
_Ret_notnull_ _Post_writable_byte_size_(_Size)
inline void* __CRTDECL operator new(size_t _Size, _Writable_bytes_(_Size) void* _Where) throw()
{
(void)_Size;
return _Where;
}
Ich bin darauf gestoßen, als ich verschiedene Formen von Operatoren neu gelernt habe (der C++-Primer hat nicht viel erklärt), aber ich konnte die Rolle dieser Funktion nicht verstehen, z. B. wie man diesen Funktionsaufruf zur Implementierung verwendet placement new
的构造效果, 比如这样two *abc = new(m) two(10);
(Obwohl ich diese Struktur gesehen habe Tatsächlich wird die obige Funktion auch aufgerufen. Das Testbeispiel lautet wie folgt (das Problem wurde kommentiert):
// test_.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
class one
{
public:
int x;
int y = 0;
};
class two
{
public:
static int p;
two(int a_) : a{a_} {}
two()
{
a = 2;
b = 3;
}
private:
class one o;
int a;
int b = 1;
};
int two::p = 66;
int main()
{
void *m = ::operator new(20, std::nothrow);
two *www = NULL;
::operator new(100, www); //注释处是本提问的问题所在, 也是上面那个代码的入口
new(www) two;
decltype(auto) x = two::p;
two *abc = new(m) two(10);
int df = 1;
_CrtDumpMemoryLeaks();
return 0;
}
Hier werde ich das Problem weiter vereinfachen und detailliert beschreiben:
Warum diese Funktion den Konstruktionseffekt erzielen kann, ist two *abc = new(m) two(10);
为例, 我没有(或者说不知道怎么在step into进去)能看清具体实现, 虽然我知道抽象出来就是实现了就地构造了two(10)
dieses Objekt.
Was ist, wenn ich main()
函数注释处这样直接调用函数的做法来实现就地构造, 我该如何修改参数和传入参数实现 two *abc = new(m) two(10);
verwende, um den gleichen Effekt zu erzielen?
PS:
Eine meiner ersten Vermutungen war, dass der übergebene _Where-Zeiger ein Zeiger auf ein bereits konstruiertes Objekt sein sollte, aber wenn er auf diese Weise implementiert wird, muss es bereits ein Objekt geben, was im Widerspruch zu placement new
stehen sollte.
/q/10... @felix 大湿 已经在这个问题里给出解答了, 才看到. 我再琢磨和搜下相关内容