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

C++ 智能指针-如果构造函数抛出怎么办?,c++,constructor,auto-ptr,C++,Constructor,Auto Ptr,我在构造函数中有一个连接到USB设备的类。如果设备不存在或其他一些情况失败,那么构造函数将抛出一个异常,调用代码将处理该异常 类似于: CDevice* pDevice = NULL; try { pDevice = new CDevice(); } 等等。我想用auto_ptr替换此调用,但不清楚如何在保持对象的正确范围的同时捕获异常 首先,我建议您不要使用auto_ptr,它有点破损,在C++11中已被弃用。更喜欢Boost或C++11 SBRM类,如std::unique\u p

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

类似于:

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

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

首先,我建议您不要使用
auto_ptr
,它有点破损,在C++11中已被弃用。更喜欢Boost或C++11 SBRM类,如
std::unique\u ptr
。不需要对示例进行太多修改就可以做到这一点

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

如果您使用的是C++11,
auto_ptr
不推荐使用。如果是C++03,则仍有TR1和Boost。是否要在对象的构造函数抛出后检查该对象?现在似乎在第一次创建指针时会出现未处理的异常。@ethrbunny:默认构造函数显式为noexcept,这意味着它永远不会抛出.Hmm。我很想试试这个,但我的系统上无法识别推荐的'-std=c++0x'选项。(CentOS 6.2)@ethrbunny我已经为
auto_ptr
提供了一个示例,该示例应该是您要查找的。您的auto_ptr示例也可以使用
reset()
方法。
std::auto_ptr<CDevice> pDevice;

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

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