コードを分析していて、特定のコードについて混乱しています。同じ意味を伝えるコード/疑似コードを投稿しました。
クラス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
ますが、ほとんどの人が言ったように、適切にリリースされていません。
呼び出し元は、一般的なキャッチ ブロックで「不明な例外」を参照しています。で作成された巨大なメモリ リークが原因Class 2
でしょうか。
406 (Out of memory error)
ログにいくつかの Informix エラーも表示されます。Unknown Exception
一連の&を吐き出した後、プロセスはコアダンプします。SQLERR406
コア ダンプがメモリ リークの副産物であるかどうかを知りたいです。