2010-10-06 21 views
8

Ho un progetto che usa molto STL. Ora sto lavorando per trasferire il progetto su una piattaforma specifica che non supporta le eccezioni. Posso disabilitare le eccezioni, tuttavia ho ancora bisogno di gestire gli errori STL.Gestione errori STL senza eccezioni

Esiste un approccio per gestire correttamente gli errori STL con le eccezioni disabilitate? Esiste un'implementazione STL di terze parti che ci aiuti?

risposta

6

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.

5

Probabilmente una versione precedente di stlport può essere configurata in modo da non utilizzare eccezioni. Questo ovviamente non è standard ma soddisfa le tue esigenze.