假设我有这段代码:
Obj* objects[10];
char* buffers[10];
// ...
buffers[1] = new char[sizeof(Obj)];
objects[1] = new(&buffers[1]) Obj();
// ...
objects[1]->~Obj();
delete[] buffers[1];
在调用delete
之后重用buffers[1]
可以吗?
重用的意思是再次使用该地址空间作为分配的地址。
我的意思是使用这段代码
objects[2] = new(&buffers[1]) A();
最佳答案
首先:placement new需要一个指针,而不是指向指针的指针
objects[1] = new(&buffers[1]) Obj(); // Nope
objects[1] = new(buffers[1]) Obj(); // Yes
就是说,在您删除了 buffers[1]
指向的内存之后,您需要先分配新内存,然后再使用它来存储对象的另一个实例。
这就是 new[]
和 delete[]
的首要目的:将一 block 内存标记为“不再需要”或“正在使用” .
不过,您当然可以重用指针 buffers[1]
以指向新的内存位置,但是在您发布的代码无效之后执行此操作:
objects[2] = new(buffers[1]) A();
因为您正试图在已删除的内存位置上构建一个对象。这将触发未定义的行为。
这是有效的
Obj* objects[10];
char* buffers[10];
// ...
buffers[1] = new char[sizeof(Obj)];
objects[1] = new(buffers[1]) Obj();
// ...
objects[1]->~Obj();
delete[] buffers[1];
// Allocate something else and build an object there. Remember that
// 'objects' is an array of pointers to Obj objects
buffers[1] = new char[sizeof(Obj)];
objects[1] = new(buffers[1]) Obj();
// You might now destroy and deallocate
关于c++ - 重新使用已删除的地址分配可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30390648/