(Примечание. Этот вопрос был мотивирован попыткой создать хакерскую обработку препроцессора для создания распределения без операции для ответа на этот другой вопрос:
Макрос, принимающий новый объект
... помните об этом!)
Вот надуманный класс:
class foo {
private:
int bar;
public:
foo(int bar) : bar (bar)
{ std::cout << "construct foo #" << bar << std::endl; }
~foo()
{ std::cout << "destruct foo #" << bar << std::endl; }
};
... который я выделю так:
// Note: for alignment, don't use char* buffer with new char[sizeof(foo)] !
void* buffer = operator new(sizeof(foo));
foo* p1 = new (buffer) foo(1);
foo* p2 = new (buffer) foo(2);
/* p1->~foo(); */ /* not necessary per spec and problematic in gen. case */
p2->~foo();
На gcc, который я получил, я получаю "ожидаемый" результат:
construct foo #1
construct foo #2
destruct foo #2
Это здорово, но может ли компилятор / среда выполнения отклонить это как злоупотреблениеи все еще быть на правой стороне спецификации?
Как насчет потоков?Если мы на самом деле не заботимся о содержимом этого класса (скажем, это просто фиктивный объект в любом случае), он, по крайней мере, не потерпит крах, например, в еще более простом приложении, которое мотивировало это с помощью POD int?