Dovrebbe allocatore di C ++: allocare il lancio o restituire nullptr quando l’allocazione fallisce?

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

  1. Controlla il valore restituito e intercetta l’eccezione nella funzione membro noexcept version (ad es. push_back , resize …);

  2. 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.