Mi scuso se questa domanda è un duplicato - ho cercato per un po ', ma è possibile che il mio Google-fu non sia all'altezza.Come dovrebbe essere liberata la memoria dopo che un'eccezione è stata lanciata in C++?
Sto modificando un programma C++ che chiama in una libreria C. La libreria C assegna un po 'di memoria (usando malloc()
), e il programma C++ lo usa e poi lo libera. Il problema è che il programma C++ può lanciare un'eccezione a metà dell'esecuzione, facendo in modo che la memoria allocata non venga mai liberata.
Come un (piuttosto artificiosa) Esempio:
/* old_library.c */
char *allocate_lots() {
char *mem = (char *)malloc(1024);
return mem;
}
/* my_prog.cpp */
void my_class::my_func() {
char *mem = allocate_lots();
bool problem = use(mem);
if (problem)
throw my_exception("Oh noes! This will be caught higher up");
free(mem); // Never gets called if problem is true
}
La mia domanda è: come debbo fare con questo? La mia prima idea era quella di avvolgere il tutto in un blocco try/catch, e nel catch basta controllare e liberare la memoria e ri-lanciare l'eccezione, ma questo mi sembra sgraziato e goffo (e non funzionerebbe bene se io voglio effettivamente catturare un'eccezione). C'è un modo migliore per farlo?
EDIT: Probabilmente avrei dovuto dire che stiamo usando g ++ 4.2.2, dal 2007, prima che fosse introdotto std :: unique_ptr. Chalk fino all'inerzia aziendale.
Perché non puoi semplicemente liberare la memoria prima di lanciare l'eccezione? –
Usa RAII, problema risolto. – Borgleader