当前位置:  开发笔记 > 编程语言 > 正文

最后在C++中

如何解决《最后在C++中》经验,为你挑选了2个好方法。

这是在标准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 obj(new Object());


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



1> David Norman..:

标准答案是使用资源分配 - 初始化缩写RAII的一些变体.基本上你构造了一个变量,它与最终块之前的块内部的块具有相同的范围,然后在对象析构函数内的finally块中进行工作.

try {
   // Some work
}
finally {
   // Cleanup code
}

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

Cleanup cleanupObj;

// Some work.

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

std::unique_ptr obj(new Object());


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



2> Johannes Sch..:

不.构建最终方式的标准方法是分离关注点(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...


不要寻找"正常的指针解决方案",如果你的意思是你想要避免RAII.如果你正在追求"好方法",那么在C++中就是RAII.所以要么使用库中的智能指针,要么你不能这样做,那就自己编写.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有