相关疑难解决方法(0)

放置new + array + alignment

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有关,所以这里是: …

c++ arrays memory-management placement-new

12
推荐指数
2
解决办法
6221
查看次数

标签 统计

arrays ×1

c++ ×1

memory-management ×1

placement-new ×1