Nel suo nuovo libro TC++PL4, Stroustrup getta una luce leggermente diversa sul a once usual practiceregarding user-controlled memory allocation and placement new
— o, più specificamente, per quanto riguarda l'enigmatica "posizionamento delete
." Nella setta del libro. 11.2.4, Stroustrup scrive:forme di collocamento del l'operatore delete funzioni
Il "posizionamento
delete
" Gli operatori non fanno nulla tranne forse informare un garbage collector che il puntatore eliminata è derivato non è più al sicuro.
Ciò implica che la pratica di programmazione del suono seguirà una chiamata esplicita a un distruttore entro a call to placement delete
.
Abbastanza giusto. Tuttavia, non v'è alcuna sintassi meglio chiamare il posizionamento delete
che l'oscuro
::operator delete(p);
Il motivo che mi chiedo è quella setta di Stroustrup. 11.2.4 non menziona tale sintassi dispari. In effetti, Stroustrup non si sofferma sulla questione; non parla affatto di sintassi. Non mi piace affatto l'aspetto di ::operator
, che interpella la questione della risoluzione dello spazio dei nomi in qualcosa che non ha proprio niente a che fare con i namespace. Non esiste una sintassi più elegante?
Per riferimento, ecco la citazione di Stroustrup nel contesto più piena:
Per impostazione predefinita, l'operatore
new
crea il suo oggetto sul negozio libero. ? Cosa se volessimo l'oggetto allocato altrove ... Siamo in grado di collocare oggetti ovunque, fornendo una funzione allocatore con argomenti extra e poi forniscono tali argomenti extra quando si utilizzanew
:void* operator new(size_t, void* p) { return p; } void buf = reinterpret_cast<void*>(0xF00F); X* p2 = new(buf) X;
A causa di questo utilizzo, la sintassi
new(buf) X
per la fornitura di ulteriori argomenti aoperator new()
è nota come sintassi del posizionamento . Si noti che ognioperator new()
assume una dimensione come primo argomento e che la dimensione dell'oggetto assegnato è implicitamente fornita. L'operator new()
utilizzato dall'operatorenew
viene scelto dalle normali regole di corrispondenza degli argomenti ; ognioperator new()
ha asize_t
come primo argomento.Il "posizionamento"
operator new()
è il più semplice di questi allocatori. E è definita nella intestazione standard<new>
:void* operator new (size_t, void* p) noexcept; void* operator new[](size_t, void* p) noexcept; void* operator delete (void* p, void*) noexcept; // if (p) make *p invalid void* operator delete[](void* p, void*) noexcept;
Il "posizionamento
delete
" operatori non fanno nulla tranne forse informare un garbage collector che il puntatore eliminata non è più al sicuro derivata.
Stroustrup continua quindi a discutere dell'uso del posizionamento new
con arene. Non sembra menzionare ancora il posizionamento delete
.
Puoi fornire un preventivo più completo? Potresti confondere una * funzione * che si chiama "operatore" con un operatore * effettivo *. Non è presente l'espressione delete-delete * in C++. –
C'è un solo tipo di "delete expression" in C, e non ammette alcuna sintassi di posizionamento (basta guardare le produzioni di grammatica nello standard). Questo è ciò che molti programmatori C++ ragionevolmente esperti significano quando dicono "non esiste * espressione delete di posizionamento * in C++". Forse ci sarà qualcosa in questo senso in C++ 14 o C++ 17, ma ora non c'è niente. –
@KerrekSB: ora ho dato una citazione più completa. – thb