微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最后在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的初始化.

原文地址:https://www.jb51.cc/c/112275.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐