这是在标准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的初始化.