У меня есть класс, который подключается к устройству USB в конструкторе. Если устройство отсутствует или возникает какая-либо другая ситуация, конструктор выдает исключение, и вызывающий код обрабатывает его.
Что-то похожее на:
CDevice* pDevice = NULL;
try
{
pDevice = new CDevice();
}
и так далее. Я хотел бы заменить этот вызов auto_ptr
но не ясно, как перехватить исключение при сохранении правильной области объекта.
Во-первых, я рекомендую вам не использовать 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(...)
{
//....
}
Других решений пока нет …