这是在标准C++中实现类似Last的行为的好方法吗?(没有特殊指针)
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 - >对象已清理
对象抛出异常 - > Handled - > NoException - >对象清理完毕
对象抛出的异常 - >抛出 - >异常 - >对象清理 - >抛出
David Norman.. 28
标准答案是使用资源分配 - 初始化缩写RAII的一些变体.基本上你构造了一个变量,它与最终块之前的块内部的块具有相同的范围,然后在对象析构函数内的finally块中进行工作.
try { // Some work } finally { // Cleanup code }
变
class Cleanup { public: ~Cleanup() { // Cleanup code } } Cleanup cleanupObj; // Some work.
这看起来非常不方便,但通常会有一个预先存在的对象可以为您清理.在您的情况下,看起来您想要破坏finally块中的对象,这意味着智能或自动指针将执行您想要的操作:
std::unique_ptr
无论抛出哪个异常,对象都将被破坏.回到RAII,在这种情况下,资源分配是为Object分配内存并构造它,初始化是auto_ptr的初始化.
标准答案是使用资源分配 - 初始化缩写RAII的一些变体.基本上你构造了一个变量,它与最终块之前的块内部的块具有相同的范围,然后在对象析构函数内的finally块中进行工作.
try { // Some work } finally { // Cleanup code }
变
class Cleanup { public: ~Cleanup() { // Cleanup code } } Cleanup cleanupObj; // Some work.
这看起来非常不方便,但通常会有一个预先存在的对象可以为您清理.在您的情况下,看起来您想要破坏finally块中的对象,这意味着智能或自动指针将执行您想要的操作:
std::unique_ptr
无论抛出哪个异常,对象都将被破坏.回到RAII,在这种情况下,资源分配是为Object分配内存并构造它,初始化是auto_ptr的初始化.
不.构建最终方式的标准方法是分离关注点(http://en.wikipedia.org/wiki/Separation_of_concerns)并使try块中使用的对象自动释放其析构函数中的资源(称为"范围限制资源管理").由于析构函数确定性地运行,与Java不同,您可以依赖它们来安全地进行清理.这样,获取资源的对象也将清理资源.
一种特殊的方法是动态内存分配.由于您是获取资源的人,因此您必须再次清理.在这里,可以使用智能指针.
try { // auto_ptr will release the memory safely upon an exception or normal // flow out of the block. Notice we use the "const auto_ptr idiom". // http://www.gotw.ca/publications/using_auto_ptr_effectively.htm std::auto_ptr const aptr(new A); } // catch...