如果这个问题是重复的,我深表歉意 - 我搜索了一段时间,但我的 Google-fu 可能无法满足要求。
我正在修改一个调用 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 中检查并释放内存并重新抛出异常,但这对我来说似乎很不优雅和笨重(如果我不能很好地工作想要实际捕获异常)。有更好的方法吗?
编辑:我可能应该提到我们正在使用 g++ 4.2.2,早在 2007 年引入 std::unique_ptr 之前。将其归结为企业惯性。