Sono sicuro che questo codice dovrebbe essere illegale, in quanto chiaramente non funzionerà, ma sembra essere consentito dal FCD C++ 0x.Legalità dell'utilizzo dell'eliminazione dell'operatore su un puntatore ottenuto dal posizionamento nuovo
class X { /* ... */};
void* raw = malloc(sizeof (X));
X* p = new (raw) X(); // according to the standard, the RHS is a placement-new expression
::operator delete(p); // definitely wrong, per litb's answer
delete p; // legal? I hope not
Forse uno di voi avvocati della lingua può spiegare come lo standard lo proibisce.
C'è anche una forma di matrice:
class X { /* ... */};
void* raw = malloc(sizeof (X));
X* p = new (raw) X[1]; // according to the standard, the RHS is a placement-new expression
::operator delete[](p); // definitely wrong, per litb's answer
delete [] p; // legal? I hope not
This is the closest question sono stato in grado di trovare.
EDIT: Io non sono solo di acquistare l'argomento che gli argomenti lingua restrittivi della norma per funzionare void ::operator delete(void*)
applicare in modo significativo per l'operando di delete
in un delete-espressione. Nella migliore delle ipotesi, la connessione tra i due è estremamente tenue, e un certo numero di espressioni sono consentito come operandi delete
che non sono validi per passare a void ::operator delete(void*)
. Ad esempio:
struct A
{
virtual ~A() {}
};
struct B1 : virtual A {};
struct B2 : virtual A {};
struct B3 : virtual A {};
struct D : virtual B1, virtual B2, virtual B3 {};
struct E : virtual B3, virtual D {};
int main(void)
{
B3* p = new E();
void* raw = malloc(sizeof (D));
B3* p2 = new (raw) D();
::operator delete(p); // definitely UB
delete p; // definitely legal
::operator delete(p2); // definitely UB
delete p2; // ???
return 0;
}
Spero questo dimostra che se un puntatore può essere passato a void operator delete(void*)
non serve a stabilire se stesso puntatore può essere utilizzato come operando di delete
.
FYI: L'FCD (N3092) non è più l'ultima bozza. L'ultima bozza è N3225. Ho mantenuto la [pagina wiki del tag C++ - 0x] (http://stackoverflow.com/tags/c%2b%2b0x/info) aggiornata con un link all'ultima bozza di PDF. –
Si noti che 5.3.5/2, che copre questo, è stato modificato nell'ultima bozza. Ora dice che il puntatore potrebbe essere "un puntatore a un oggetto non matrice creato da una precedente _new-espressione_", e una _new-espressione_ include effettivamente nuove espressioni di posizionamento. Non penso che sia inteso. –
@James: Grazie MOLTO tanto per la nuova bozza. E 5.3.5 è esattamente la sezione che sto pensando dovrebbe proibire, ma non lo fa. Potresti per favore guardare la mia risposta (mi sto preparando per inserire qualsiasi lingua modificata dalla nuova bozza) e fammi sapere se pensi che abbia qualche relazione con questa domanda? –