Я хорошо осведомлен о шаблоне RAII, std::unique_ptr
и других «умных указателях» в C ++ 11, но все еще есть некоторые случаи, с которыми я не могу понять, как правильно их обрабатывать, не имея раздела goto Cleanup
, который, наконец, выполняет очистку.
В частности, я думаю о программировании для Windows, где иногда мне хочется утечки дескрипторов, а иногда нет.
Если у меня есть функция, которая выглядит примерно так:
PROCESS_INFORMATION p;
if (!CreateProcess(... &p))
{
throw windows_error(GetLastError());
}
DWORD r = WaitForSingleObject(h, 5000);
if (r == WAIT_TIMEOUT || r == WAIT_FAILED)
{
// terminate process, close handles
throw ...;
}
if (!SetEnvironmentVariable(...))
{
// terminate process, close handles
throw windows_error;
}
(a few other operations that if they fail i have cleanup to do).
return process handle;
Я действительно не понимаю, как unique_ptr
может мне здесь помочь, если я не использую release()
на unique_ptr
после всего if
, чтобы указать на успех / сказать unique_ptr
не убирать его. (Я могу создать специальный удалитель для unique_ptr
, чтобы он правильно очищал дескрипторы окон). Однако у меня вопрос в том, является ли такое использование release()
на интеллектуальных указателях «правильным» для случаев, когда я хочу передать выделенную память / дескрипторы обратно вызывающему абоненту? Есть ли способ лучше? Думаю, возврат shared_ptr
тоже может сработать ...