Добрый день!
Думаю, что следующий подход в корне неверен:
void function1(std::shared_ptr<Image> image, std::shared_ptr<ColorData> color_data)
{
auto deleter = [image, color_data]() {image->Clear(); color_data->Clear(); };
// ...
try
{
some_function2();
}
catch (...)
{
deleter();
throw some_exception("Error text...");
}
// ...
int error_state = some_function3();
if (!error_state)
{
deleter();
throw some_exception("Error text...");
}
// ...
}
Фактически здесь лямбда с захватом контекста используется как макрос, то есть когда по-старинке писали вручную очистку ресурсов (до RAII-эпохи), так делать не нужно.