Я анализировал код, и я смущен определенным кодом. Я опубликовал код/псевдокод, который будет передавать то же значение.Кто несет ответственность за удаление?
Класс 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
- это процесс на С ++, а Class 2
- это библиотека, которая ведет переговоры с базой данных Informix. Class2::get_records_from_db()
- это функция, которая запрашивает базу данных Informix и возвращает результат. Я улучшил код выше, который больше похож на реальный код.
Collection
Объекты имеют дело с 200k объектов row
, которые, как большинство из вас сказали, не выпущены должным образом.
Звонящий видит «Неизвестное исключение» в общем блоке catch. Может ли это быть из-за огромных утечек памяти, созданных в Class 2
?
Я также вижу некоторые ошибки Informix 406 (Out of memory error)
в журналах. Процесс ядро-отвалы после выплевывая серию Unknown Exception
& SQLERR406
Я хочу знать дамп, является ли побочный продукт из утечек памяти.
Если код действительно является тем, что вы показываете, есть утечки памяти. –
В 'get_records_from_db' переменная' row' обязательно должна быть удалена внутри 'catch'. Кроме того, поскольку 'clt' возвращается, должно быть установлено' NULL' внутри 'catch' или будет висящий указатель. После того, как функция вернется, ответственность за удаление возвращаемой выделенной памяти, по моему мнению, должна быть ответственной. Однако он должен быть хорошо документирован, чтобы пользователь API знал об этом. –
-1 запрашивает ответственность за освобождение и ** не документирует тип возврата **. –