#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;
}
Saya menemuinya apabila mempelajari pelbagai bentuk operator baharu (primer c++ tidak banyak menerangkan), tetapi saya tidak dapat memahami peranan fungsi ini, seperti cara menggunakan panggilan fungsi ini untuk melaksanakan placement new
的构造效果, 比如这样two *abc = new(m) two(10);
(Walaupun saya melihat struktur ini Malah, fungsi di atas juga dipanggil), dan Contoh ujian adalah seperti berikut (masalah telah diulas):
// 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;
}
Di sini saya akan memudahkan dan memperincikan lagi masalah:
Mengapa fungsi ini boleh mencapai kesan pembinaan ialah two *abc = new(m) two(10);
为例, 我没有(或者说不知道怎么在step into进去)能看清具体实现, 虽然我知道抽象出来就是实现了就地构造了two(10)
objek ini.
Bagaimana jika saya menggunakan main()
函数注释处这样直接调用函数的做法来实现就地构造, 我该如何修改参数和传入参数实现 two *abc = new(m) two(10);
untuk mendapatkan kesan yang sama?
PS:
Salah satu tekaan awal saya ialah _Where pointer pass in sepatutnya menjadi penunjuk kepada objek yang telah dibina, tetapi jika dilaksanakan dengan cara ini, sudah semestinya ada objek, yang sepatutnya bertentangan dengan placement new
.
/q/10... @felix Dashi telah pun memberikan jawapan kepada soalan ini, saya baru melihatnya saya akan memikirkannya dan mencari kandungan yang berkaitan