Il problema con l'acquisizione di una libreria di std esistente e la compilazione con eccezioni disabilitate è che le stesse interfacce del contenitore std presuppongono che le eccezioni siano abilitate. Usando le eccezioni, l'operatore new getterà se non può acquisire memoria, senza eccezioni, l'operatore new restituisce invece uno 0, che i contenitori std non possono gestire.
Un approccio è utilizzare solo algoritmi STL + vettore. Puoi replicare circa il 95% di ciò che fanno gli altri contenitori. Il problema è che la maggior parte delle implementazioni STL per scontato che
v.reserve(v.size()+1);
assert(v.size()+1<=v.capacity());
sarà mai affermare (in quanto riserva sarà gettare se non c'è memoria). Per assicurare questo non getta mai, ho usato contenitori "a capacità fissa", cioè contenitori con una capacità fissata in fase di compilazione. Fondamentalmente questi sono vettori in cui passo in uno speciale allocatore. Quindi puoi controllare il max_size() del contenitore prima dell'inserimento. Quindi evita semplicemente di usare cose come a(). Per una prevedibilità ancora migliore, usa basic_string invece di vector. Ciò ti obbliga a memorizzare solo i tipi di POD, che non generano mai quando sono copiati o costruiti di default. Inoltre, i requisiti di memoria sono più facili da calcolare.
Un altro approccio consiste nell'utilizzare contenitori intrusivi. Questi non gettare (al di fuori di un uso improprio dell'interfaccia forse), dal momento che non acquisiscono mai memoria in primo luogo.
fonte
2010-10-07 13:12:53