Il concetto Allocator e std :: allocator_traits non dicono cosa farà l’allocazione quando l’allocazione fallisce – restituirà nullptr o throw?
Quando scrivo un contenitore utilizzando l’API di allocatore standard, dovrei farlo
Controlla il valore restituito e intercetta l’eccezione nella funzione membro noexcept
version (ad es. push_back
, resize
…);
Controlla il valore di ritorno e lancia se fallisce nel lancio di eccezione
così che non importa se getta o no, otterrò il comportamento corretto.
La bozza n4659 per lo standard C ++ dice in 23.10.9 L’allocatore predefinito [default.allocator] (enfatizza il mio):
23.10.9.1 membri allocatori [allocator.members]
…T* allocate(size_t n);
2 Restituisce: Un puntatore all’elemento iniziale di una matrice di memoria di dimensione n * sizeof (T), allineato in modo appropriato per gli oggetti di tipo T.
3 Note: la memorizzazione si ottiene chiamando il nuovo operatore (21.6.2), ma non è specificato quando o con quale frequenza viene chiamata questa funzione.
4 Tiri: bad_alloc se non è ansible ottenere lo spazio di archiviazione.
Rende chiaro che l’allocatore standard bad_alloc
un’eccezione bad_alloc
se non può allocare memoria.
Sopra è per l’allocatore standard. Il requisito per ogni allocatore è descritto in 20.5.3.5 Requisiti dell’allocatore [allocator.requirements] e tabella 31 – I requisiti dell’allocatore contengono:
a.allocate (n) [Tipo di ritorno:] X :: pointer [Assertion / note / pre / post-condition] La memoria è allocata per n oggetti di tipo T ma gli oggetti non sono costruiti. allocare può generare un’eccezione appropriata
La mia comprensione è che l’ allocate
può tornare solo quando la memoria è stata allocata. Quindi l’allocatore dovrebbe lanciare un’eccezione appropriata (non necessariamente bad_alloc
anche se sarebbe del tutto appropriato) se non fosse ansible allocare la memoria.