Guardando il codice legacy ho trovato qualcosa di simile al seguente codiceoverloading degli operatori nuovi ed eccezione correttezza
void* legacy_type::operator new(size_t size) {
return pool_alloc(size);
}
pool_alloc è noto per non gettare e restituire 0 in caso di guasto.
Non c'è sovraccarico per la variante std :: nothrow di new qui.
Mi chiedo se questo codice sia semanticamente corretto e abbia un comportamento ben definito.
In caso di new (std::nothrow) legacy_type;
utilizzare pool_alloc personalizzato? Nel mio compilatore non si compila affatto. È un comportamento ben definito?
Se il costruttore si avvia e si blocca a causa di this==0
se sovraccarico operator new
restituisce zero? Nel mio compilatore funziona (e si blocca durante l'inizializzazione del membro). È un comportamento standard ben definito?
Il costruttore non deve essere chiamato se "operatore new" restituisce un puntatore nullo e quindi l'intera espressione "new" restituirà un puntatore nullo. – Simple
È comportamento accettabile in C++, ma si bloccherà se la classe ha un tavolo virtuale o un costruttore che non prova 'questo == 0 'prima di accedere membri variabili. Ovviamente non è usuale e probabilmente dovrebbe essere evitato. Si può cercare di eliminare solo quella definizione e vedere cosa succede ... –