Я выделяю объекты в куче, и при некоторых обстоятельствах я объединять их в новый объект (мой класс Foo содержит в основном 2-3 контейнера STL). (Альтернативой было бы использование копий, но я думаю, что это было бы менее эффективно.)Устранение утечек памяти с исключениями на C++
Эти операции могут быть неудачными, поэтому могут быть выбраны исключения. Если я не освобожу динамическую память всякий раз, когда я выдаю исключение, у меня будут утечки памяти.
Будет ли auto_ptr/unique_ptr иметь смысл в этом случае? Я так думаю, так как Combine - это «раковина», но что, если бы я хотел использовать f1 и f2 после вызова Combine?
Спасибо!
Вот мой код:
Foo* MakeFoo()
{
Foo* foo = 0;
Foo* f1 = SimpleFoo();
if(f1)
{
Foo* f2 = SimpleFoo();
if(f2)
{
Foo* combined = Combine(f1, f2);
delete f2;
delete f1;
}
else
foo = f1;
}
delete foo;
}
Foo* SimpleFoo()
{
Foo* f = 0;
if(something)
{
f = new Foo;
if(somethingElse)
throw std::runtime_error("Error"); // Memory leak
}
return f;
}
Foo* Combine(const Foo* f1, const Foo* f2)
{
assert(f1);
assert(f2);
// Memory leak in MakeFoo()
if(something)
throw std::runtime_error("Error");
Foo* foo = new Foo;
// Maybe one could also simply modify f1
foo->Add(*f1);
foo->Add(*f2);
return foo;
}
Не могли бы вы немного убрать код? Что такое 'что-то 'и' somethingElse'? Где вы ловите исключения? –
что-то и что-тоElse - это всего лишь некоторые условия (код является частью очень простого рекурсивного спуска парсера), исключения попадают в основную. – Andreas