Приносим извинения, если этот вопрос является дубликатом - я искал какое-то время, но возможно, что мой Google-фу просто не в состоянии понюхать.Как освободить память после исключения на C++?
Я изменяю программу на C++, которая вызывает в библиотеке C. Библиотека C выделяет кучу памяти (используя malloc()
), а программа C++ использует ее, а затем освобождает ее. Уловка заключается в том, что программа на C++ может вызывать исключение на полпути через выполнение, в результате чего выделенная память никогда не будет освобождена.
В (довольно надуманный) Например:
/* 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
}
Мой вопрос: как должно мне справиться с этим? Моя первая идея заключалась в том, чтобы обернуть все это в блок try/catch, а в catch просто проверить и освободить память и повторно выбросить исключение, но это кажется мне грубым и неуклюжим (и не получится хорошо, если я хочу фактически поймать исключение). Есть ли лучший способ сделать это?
EDIT: Возможно, я должен был упомянуть, что мы использовали g ++ 4.2.2, начиная с 2007 года, до того, как был введен std :: unique_ptr. Мел это до корпоративной инерции.
Почему вы не можете просто освободить память перед тем, как выбросить исключение? –
Использование RAII, проблема решена. – Borgleader