Прежде всего: placement new ожидает указатель, а не указатель на указатель
objects[1] = new(&buffers[1]) Obj(); // Nope
objects[1] = new(buffers[1]) Obj(); // Yes
что сказал, после того, как вы удалили память, на который указывает buffers[1]
вам нужно выделить новую память перед использованием чтобы сохранить другой экземпляр объекта.
Это цель new[]
и delete[]
в первую очередь: маркировка куска памяти как «более не нужна» или «используется».
Вы можете, однако, конечно, повторно использовать указатель 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
При повторном использовании вы имеете в виду перераспределение памяти и ее использование? –
Повторно использовать его каким образом? Повторное использование пространства хранения для хранения другого указателя? Конечно. Сделайте что-нибудь с адресом внутри 'buffers [1]' после того, как вы его удалили? Неа. – user657267
Да как использовать это пространство снова для другого экземпляра объектов –