SomeObj<unsigned int>* Buffer;
char* BufferPtr = MemoryManager::giveMeSomeBytes(resX*resY*sizeof(SomeObj<unsigned int>));
Buffer = new(BufferPtr) SomeObj<unsigned int>[resX*resY];
Run Code Online (Sandbox Code Playgroud)
当我用调试器跳过这些行时,它会显示变量Buffer和BufferPtr的值:
BufferPtr: 0x0d7f004c
Buffer: 0x0d7f0050
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么这些价值观会有所不同.我理解它的方式,placement new应该使用从地址'BufferPtr'开始的内存来使用分配的内存上的默认构造函数初始化数组元素,并返回指向数组中第一个元素的第一个字节的指针,该指针应该是传递给placement new运算符的字节完全相同.
我是否理解错误或有人能告诉我为什么价值观不同?
谢谢!
//编辑:好的 - 我进一步调查了这个问题并得到了更令人困惑的结果:
int size = sizeof(matth_ptr<int>);
char* testPtr1 = (char*)malloc(a_resX*a_resY*sizeof(int));
int* test1 = new(testPtr1) int[a_resX*a_resY];
char* testPtr2 = mmgr::requestMemory(a_resX*a_resY*sizeof(int));
int* test2 = new(testPtr2) int[a_resX*a_resY];
char* testPtr3 = (char*)malloc(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test3 = new(testPtr3)matth_ptr<int>[a_resX*a_resY];
char* testPtr4 = mmgr::requestMemory(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test4 = new(testPtr4)matth_ptr<int>[a_resX*a_resY];
Run Code Online (Sandbox Code Playgroud)
调试器为我的变量返回以下值:
size: 4
testPtr1:0x05100418
test1: 0x05100418
testPtr2:0x0da80050
test2: 0x0da80050
testPtr3:0x05101458
test3: 0x0510145c
testPtr4:0x0da81050
test4: 0x0da81054
Run Code Online (Sandbox Code Playgroud)
所以它显然必须与我的通用smartpointer类matth_ptr有关,所以这里是: …