智能指针 - 如果构造函数抛出什么?

时间:2013-04-18 20:06:14

标签: c++ constructor auto-ptr

我有一个连接到构造函数中的USB设备的类。如果设备不存在或某些其他情况失败,则构造函数抛出异常,调用代码处理它。

类似于:

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

等等。我想用auto_ptr替换此调用,但不清楚如何在保持对象的正确范围的同时捕获异常。

1 个答案:

答案 0 :(得分:6)

首先,我建议你不要使用auto_ptr,它有点破碎,在C ++ 11中已被弃用。首选Boost或C ++ 11 SBRM类,如std::unique_ptr。您无需对示例进行太多修改即可完成此操作。

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

如果newCDevice的构造函数抛出,则pDevice将保持为空。使用auto_ptr并没有太大的不同,只是根据可用的替代方案不推荐。

std::auto_ptr<CDevice> pDevice;

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

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