最后在C

前端之家收集整理的这篇文章主要介绍了最后在C前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是在标准C中实现类似终极的行为的好方法吗?
(无特殊指针)
class Exception : public Exception
    { public: virtual bool isException() { return true; } };

class NoException : public Exception
    { public: bool isException() { return false; } };


Object *myObject = 0;

try
{
  // OBJECT CREATION AND PROCESSING
  try
  {
    myObject = new Object();

    // Do something with myObject.
  }

  // EXCEPTION HANDLING
  catch (Exception &e)
  {
    // When there is an excepion,handle or throw,// else NoException will be thrown.
  }

  throw NoException();
}

// CLEAN UP
catch (Exception &e)
{
  delete myObject;

  if (e.isException()) throw e;
}

>对象没有抛出异常 – > NoException – >对象清理
>由对象抛出的异常 – >处理 – > NoException – >对象清理
>由对象抛出的异常 – >抛出 – >异常 – >对象清理 – >抛出该异常

解决方法

标准答案是使用 resource-allocation-is-initialization缩写RAII的一些变体.基本上,您构造一个变量,该变量与finally之前的块内的块具有相同的作用域,然后在对象析构函数中的finally块中进行工作.
try {
   // Some work
}
finally {
   // Cleanup code
}

class Cleanup
{
public:
    ~Cleanup()
    {
        // Cleanup code
    }
}

Cleanup cleanupObj;

// Some work.

这看起来非常不方便,但通常会有一个预先存在的对象,为您做清理.在你的情况下,看起来你想要破坏finally块中的对象,这意味着一个智能或自动指针将会做你想要的:

std::auto_ptr<Object> obj(new Object());

无论抛出什么异常,对象将被破坏.回到RAII,在这种情况下,资源分配是为Object分配内存并构造它,初始化是auto_ptr的初始化.

猜你在找的C&C++相关文章