我正在分析代码,但对特定代码感到困惑。我已经发布了将传达相同含义的代码/伪代码。
1级
Class1::Func1()
{
Collection* cltn;
try
{
cltn = Class2::get_records_from_db();
}
catch(Informix error)
{}
catch(DB Error)
{}
catch(...)
{ Unknown exception } //I get this error always once the process processes lot of records
}
2 级
Collection* Class2::get_records_from_db()
{
Collection *clt = new Collection();
try
{
//Query database
For each row in query result
Row *row = new row();
populate(row)
clt->add(*row)
...
if( Informix error)
{
throw Informix error;
}
}
catch(...)
{
delete clt; //Who will delete row?
clt = 0;
throw Db error
}
return clt; //Who will delete clt?
}
问题 - 第 2 部分
感谢您对第一个问题的见解。现在这是正在发生的真正问题。
Class 1
是一个 C++ 进程,Class 2
是一个与 Informix 数据库对话的库。
Class2::get_records_from_db()
是一个查询 Informix DB 并返回结果集的函数。我已经增强了上面的代码,它更类似于真实的代码。
Collection
objects 处理 200k 个row
对象,正如你们大多数人所说的那样,它们没有正确释放。
调用者在通用 catch 块中看到“未知异常”。这可能是因为在 中创建了巨大的内存泄漏Class 2
吗?
我还在日志中看到了一些 Informix 错误406 (Out of memory error)
。吐出一系列Unknown Exception
&后进程核心转储SQLERR406
我想知道核心转储是否是内存泄漏的副产品。