Насколько я понимаю, следующее будет стандартным: совместимый способ сделать это:
(Предположим на данный момент, что ничто не переопределяет new, и деструктор SomeClass не выдает исключение)
Код: Выделить всё
#include
void f(std::size_t n) {
void* buf = ::operator new(sizeof(SomeClass) + n);
SomeClass* obj = new(buf) SomeClass;
// Do stuff with obj
obj->~SomeClass();
::operator delete(buf);
}
Код: Выделить всё
#include
void f(std::size_t n) {
void* buf = ::operator new(sizeof(SomeClass) + n);
SomeClass* obj = new(buf) SomeClass;
// Do stuff with obj
obj->~SomeClass();
::operator delete(static_cast(obj));
}
Наконец, есть ли шанс, что что-то вроде этого допустимо:
Код: Выделить всё
#include
void f(std::size_t n) {
void* buf = ::operator new(sizeof(SomeClass) + n);
SomeClass* obj = new(buf) SomeClass;
// Do stuff with obj
delete obj;
}
EDIT: Мне только что пришло в голову, не мог бы другой способ сделать это, добавив переопределение для оператора new, а затем используя его в новом месте размещения? Другими словами, допустимо ли что-то вроде этого:
Код: Выделить всё
#include
enum class ExtraSpace : std::size_t {};
void* operator new(std::size_t size, ExtraSpace n) {
return ::operator new(size + static_cast(n));
}
void f(std::size_t n) {
SomeClass* obj = new(ExtraSpace(n)) SomeClass;
// Do stuff with obj
delete obj;
}
Подробнее здесь: https://stackoverflow.com/questions/782 ... cement-new