智能指针——如果构造函数抛出怎么办?

smart pointer - what if constructor throws?

本文关键字:怎么办 构造函数 指针 如果 智能      更新时间:2023-10-16

我在构造函数中有一个连接到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(...)
{
    //....
}

如果newCDevice的构造函数抛出,则pDevice将保持为空。使用auto_ptr没有太大的不同,只是考虑到可用的替代方案,不建议使用。

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