最后在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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...