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

eth*_*nny 2 c++ constructor auto-ptr

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

类似于:

CDevice* pDevice = NULL;
try
{
    pDevice = new CDevice();
}
Run Code Online (Sandbox Code Playgroud)

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

Cap*_*ous 6

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

std::unique_ptr<CDevice> pDevice;
try
{
    pDevice.reset(new CDevice());
}
catch(...)
{
    //....
}
Run Code Online (Sandbox Code Playgroud)

如果new或者CDevicethrows 的构造函数那么pDevice将保持为空.使用auto_ptr没有太大的不同,只是考虑到可用的替代品,不建议使用.

std::auto_ptr<CDevice> pDevice;

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

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