2013-04-18 2 views
2

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

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

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

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

+0

Если вы используете C++ 11, 'auto_ptr' устарел. Если C++ 03, все еще есть TR1 и Boost. – chris

+0

вы хотите осмотреть объект после его броска конструктора? – yngccc

ответ

6

Во-первых, я рекомендую вам не использовать 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(...) 
{ 
    //.... 
} 
+0

Похоже, что у меня будет необработанное исключение в первом создании указателя. – ethrbunny

+0

Создание этого указателя не выбрасывает. –

+0

@ethrbunny: конструктор по умолчанию явно не имеет значения, что означает, что он никогда не будет бросать. – rubenvb

Смежные вопросы