(Nota: questa domanda è stata motivata dal tentativo di venire con preprocessore aggiustamenti per generare un'allocazione no-op per rispondere a quest'altra domanda:!E 'ben definito/legale per il posizionamento-nuove più volte allo stesso indirizzo?
... tenete a mente)
Ecco una classe artificiosa:
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; }
};
... che mi assegnerà in questo modo:
// 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();
Sulla gcc che ho intorno, ho ottenere il risultato "atteso":
construct foo #1
construct foo #2
destruct foo #2
Che è grande, ma potrebbe il compilatore/runtime rifiutare questa come un abuso e di essere ancora sul lato destro delle specifiche?
Che ne dici di filettatura? Se in realtà non ci interessa il contenuto di questa classe (diciamo che è solo un oggetto fittizio) almeno non si bloccherà, come nell'applicazione ancora più semplice che ha motivato questo con un POD int?
Sono abbastanza sicuro (ma non ho riferimenti) che questo non è kosher per gli oggetti non POD. Non sono sicuro del POD ... – bdonlan
Penso che intendessi "foo * p1 = new (buffer) foo (1);" –
Il distruttore non modifica lo stato dell'oggetto. La maggior parte dei distruttori non sono così. –