Прошу прощения, если этот вопрос повторяется - я некоторое время искал, но, возможно, мой гугл-фу просто не на высоте.
Я изменяю программу 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. Спишите это на корпоративную инерцию.