delete p
è equivalente a
p->~MyStruct();
operator delete(p);
meno MyStruct
ha un'alternativa operator delete
, così il vostro esempio dovrebbe essere ben definito con la semantica attesi.
[expr.delete]/2
stati:
il valore dell'operando di cancellazione può essere ... un puntatore a un oggetto non array creati da un precedente nuova espressione.
Il nuovo posizionamento è un tipo di nuova espressione.[expr.new]/1
:
nuova espressione:
:: optnuovo nuova collocazione opt nuovo-tipo-id new-inizializzatore opt
:: optnuovo nuova collocazione opt ( tipo-id) nuova initializer opt
delete
è definito come una chiamata al distruttore dell'oggetto e quindi una chiamata alla funzione deallocazione per la memoria. [expr.delete]/6,7
:
... il delete-espressione invocherà il distruttore (se presente) per l'oggetto ...
... il delete-espressione chiamerà una funzione deallocazione. ..
finché la funzione di deallocazione corrisponde la funzione di allocazione (che dovrebbe, a patto che non sia sovraccarico operator delete
per la classe), allora questo dovrebbe essere ben definito.
C'è una differenza nella rappresentazione della memoria risultante tra il modo in cui è stato assegnato e costruito l'oggetto rispetto a farlo in un unico passaggio? Se sì, probabilmente l'eliminazione fallirà. Se no, probabilmente l'eliminazione avrà successo. Quindi la domanda si riduce a come lo standard specifica l'operazione di 'new', non' delete'. – nobar
Ho provato questo con gcc + Valgrind e non sono stati segnalati errori. – nobar