Ich habe einen Code analysiert und bin bei einem bestimmten Code verwirrt. Ich habe den Code/Pseudocode gepostet, der die gleiche Bedeutung vermittelt.
Klasse 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
}
Klasse 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?
}
Problem - Teil 2
Danke für den Einblick in das erste Problem. Hier ist nun das eigentliche Problem, das auftritt.
Class 1
ist ein C++-Prozess und Class 2
ist eine Bibliothek, die mit der Informix-Datenbank kommuniziert. Class2::get_records_from_db()
ist eine Funktion, die eine Informix-DB abfragt und die Ergebnismenge zurückgibt. Ich habe den obigen Code verbessert, der dem echten Code ähnlicher ist.
Collection
Objekte handelt mit 200k von row
Objekte, die, wie die meisten von Ihnen sagten, nicht richtig freigegeben werden.
Der Aufrufer sieht "Unbekannte Ausnahme" im allgemeinen Catch-Block. Kann das an den riesigen Speicherlecks liegen, die in Class 2
?
Ich sehe auch einige Informix-Fehler 406 (Out of memory error)
in den Protokollen. Der Prozess macht einen Core-Dump, nachdem er eine Reihe von Unknown Exception
& SQLERR406
Ich möchte wissen, ob der Core Dump ein Nebenprodukt der Speicherlecks ist.