Come è possibile che un'espressione new
in un programma possa generare un errore bad_alloc
nonostante non ci sia #include <new>
(poiché questo errore è is defined in the <new>
header)?Nuovi tiri bad_alloc nonostante l'intestazione <new> non sia stata definita?
Da 3.7.4. di N3337:
La libreria fornisce le definizioni predefinite per le funzioni di allocazione e deallocazione globali. Alcune funzioni di assegnazione e deallocazione globali sono sostituibili (18.6.1). Un programma C++ deve fornire al massimo una definizione di una funzione di allocazione o di deallocazione sostituibile. Qualsiasi definizione di tale funzione sostituisce la versione predefinita fornita nella libreria (17.6.4.6). Le seguenti funzioni di allocazione e deallocazione (18.6) sono implicitamente dichiarate nell'ambito globale in ciascuna unità di traduzione di un programma.
void* operator new(std::size_t); void* operator new[](std::size_t); void operator delete(void*); void operator delete[](void*);
Queste dichiarazioni implicite introdurre solo i nomi delle funzioni
operator new
,operator new[]
,operator delete
eoperator delete[]
. [Nota: le dichiarazioni implicite non introducono i nomistd
,std::size_t
o altri nomi utilizzati dalla libreria per dichiarare questi nomi. Pertanto, una nuova espressione, delete-expression o chiamata di funzione che fa riferimento a una di queste funzioni senza includere l'intestazione<new>
è ben formata. Tuttavia, il riferimento astd
ostd::size_t
non è corretto a meno che il nome non sia stato dichiarato includendo l'intestazione appropriata. -end notare] Assegnazione e/o funzioni di deallocazione possono anche essere dichiarati e definiti per ogni classe
Questo ancora non mi è chiaro. Le dichiarazioni implicite utilizzano std::size_t
ma non le introducono (e lo stesso deve essere il caso per bad_alloc
)? E non è necessario introdurre std::size_t
prima che sia possibile utilizzare un'espressione new
? Può esserci qualche senso su come sia, o devo prenderlo al valore nominale?
Bene, si sta collegando con la libreria standard C++, che include '', e quindi conosce 'std :: bad_alloc'. –
Potrebbe avere qualcosa a che fare con il fatto che un'intestazione standard C++ è ufficialmente autorizzata a includere qualsiasi altra intestazione standard C++, ma suppongo che non sia tutta la storia per quanto riguarda queste funzioni. –
Dopo alcuni esperimenti, concludo che questo è effettivamente il caso. Scriverò una risposta a riguardo. –