умный указатель — что, если конструктор бросает?

У меня есть класс, который подключается к устройству USB в конструкторе. Если устройство отсутствует или возникает какая-либо другая ситуация, конструктор выдает исключение, и вызывающий код обрабатывает его.

Что-то похожее на:

CDevice* pDevice = NULL;
try
{
pDevice = new CDevice();
}

и так далее. Я хотел бы заменить этот вызов auto_ptr но не ясно, как перехватить исключение при сохранении правильной области объекта.

2

Решение

Во-первых, я рекомендую вам не использовать auto_ptr, он несколько сломан и устарел в C ++ 11. Предпочитаю классы Boost или C ++ 11 SBRM, такие как std::unique_ptr, Вы можете сделать это без особых изменений в вашем примере.

std::unique_ptr<CDevice> pDevice;
try
{
pDevice.reset(new CDevice());
}
catch(...)
{
//....
}

Если new или конструктор CDevice бросает, тогда pDevice останется пустым. С помощью auto_ptr не сильно отличается, просто не рекомендуется, учитывая доступные альтернативы.

std::auto_ptr<CDevice> pDevice;

try
{
pDevice.reset(new CDevice());

//pDevice = std::auto_ptr<CDevice>(new CDevice());
// ^^ historical masochism.
}
catch(...)
{
//....
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]