gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:38:49 25 4
gpt4 key购买 nike

假设我有这段代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com