L'operatore new
(o per POD, malloc/calloc) supporta una forma semplice ed efficiente di errore durante l'allocazione di grandi blocchi di memoria.I contenitori di libreria standard (STL) supportano una forma di allocazione di nothrow?
Dire che abbiamo questo:
const size_t sz = GetPotentiallyLargeBufferSize(); // 1M - 1000M
T* p = new (nothrow) T[sz];
if(!p) {
return sorry_not_enough_mem_would_you_like_to_try_again;
}
...
C'è un tale costrutto per le std :: contenitori, o avrà devo sempre gestire un'eccezione (previsto !!) con std::vector
e gli amici?
Sarebbe là forse essere un modo per scrivere un allocatore personalizzato che prealloca la memoria e poi passare questo allocatore personalizzato al vettore, in modo che, fintanto che il vettore non chiede più memoria di quanto messo in allocatore in anticipo, non fallirà?
Ripensamento: Ciò che veramente sarebbe necessario fosse una funzione membro bool std::vector::reserve(std::nothrow) {...}
in aggiunta alla funzione di riserva normale. Ma dal momento che ciò avrebbe senso solo se gli allocatori fossero stati estesi anche per consentire l'allocazione del nothrow, non accadrà. Sembra (nothrow) nuovo è buono per qualcosa, dopo tutto :-)
Edit: Per quanto riguarda il motivo per cui sto chiedendo anche questo:
ho pensato a questa domanda durante il debug (1a possibilità/Gestione delle eccezioni della seconda possibilità del debugger): Se ho impostato il mio debugger su 1st-chance catch any bad_alloc perché sto testando per condizioni di memoria bassa, sarebbe fastidioso se anche catturasse quelle eccezioni bad_alloc che sono già buone atteso e gestito nel codice. Non era/non è un grosso problema ma mi è venuto in mente che il sermone dice che le eccezioni sono per circostanze eccezionali, e qualcosa che già mi aspetto di accadere ogni strana chiamata nel codice non è eccezionale.
Se new (nothrow)
ha i suoi usi legittimi, avrebbe anche una riserva di vettori-nothrow.
Non è un grosso problema scrivere un costrutto 'try ... catch'. Se ne possiedi molti, potresti scrivere una 'funzione di wrapper singolo' modello T * MyAlloc (size_t) ', con la gestione delle eccezioni all'interno. –
TonyK
a volte è un grosso problema. –
anche quando assegni un gigabyte e ti avvicini a OOM? Ne dubito. –