c++ - 重新使用已删除的地址分配可以吗?

标签 c++ memory placement-new

假设我有这段代码:

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/

相关文章:

c++ - 如何在 system() 中使用通配符表达式

java - Java 8 中的字符串使用多少内存?

ios - 保存 WKWebView 的状态 (iOS)

c++ - Visual Studio 包含缩短的项目宏

c++ - 具有轻型用户数据和引用的 Lua 注册表有什么区别?

c++ - qt 插槽中的信令失败

multithreading - 线程可以争用对单个地址的访问权吗?

c++ - 在初始化内存上使用 placement new 是否合法?

c++ - 在 C++ 中构造数组元素在循环中调用 new 而不是 new[] 是否合法?

c++ - 新的展示位置取决于iostream