我有一个在构造函数中连接到 USB 设备的类。如果设备不存在或其他情况失败,则构造函数会抛出异常,调用代码会处理它。
类似于:
CDevice* pDevice = NULL;
try
{
pDevice = new CDevice();
}
等等。我想用一个替换这个调用,auto_ptr
但我不清楚如何在保持对象的正确范围的同时捕获异常。
我有一个在构造函数中连接到 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(...)
{
//....
}
如果new
或CDevice
throws 的构造函数,则 pDevice 将保持为空。使用auto_ptr
并没有太大的不同,只是考虑到可用的替代品,不推荐使用。
std::auto_ptr<CDevice> pDevice;
try
{
pDevice.reset(new CDevice());
//pDevice = std::auto_ptr<CDevice>(new CDevice());
// ^^ historical masochism.
}
catch(...)
{
//....
}