6

对于一个学校项目,我有 3 个班级:鸡蛋、巢和母鸡。我们需要使用new创建每个 in 的实例main,调用display()每个,然后显式删除每个。这很容易。

我的问题是不知道如何正确捕捉bad_alloc; 应该在任何new调用上抛出 1。

现在,它看起来像这样:

int main(int argc, char* argv[]) {
    using namespace std;

    cout << "Creating new instances on the heap..." << endl;
    Egg* egg = new Egg("New Egg");
    Nest* nest = new Nest("New Nest");
    Hen* hen = new Hen("New Hen");

    cout << sizeof(*egg) << endl;
    cout << sizeof(*nest) << endl;
    cout << sizeof(*hen) << endl;


    cout << "\nCalling display() on each..." << endl;
    egg->display();
    nest->display();
    hen->display();

    cout << "\nExplicitly deleting each instance..." << endl;
    delete egg;
    delete nest;
    delete hen;


    cout << "\nDone" << endl;

}

我想过将整个块从第一个new到最后一个块包装delete在一个try块中,然后只捕获 abad_alloc并调用delete每个实例,但后来我想到了以下场景:

  • egg已成功创建
  • nest失败,并抛出一个bad_alloc

如果此时我对所有 3 个都调用 delete,hen应该抛出另一个异常,因为它从来没有被分配过,所以它不能被释放。

我知道理想情况下,您不会new像这样在公开场合使用,但是处理这种情况的最佳方法是什么?是不是太琐碎太做作而不能妥善处理?

4

2 回答 2

6

你可以这样做

  1. 先声明它们。设置nullptr
  2. 启动 try 块
  3. 分配。
  4. 捕捉 - 删除它们 - 删除 nullprt 是一个 noop
于 2015-03-22T16:12:50.677 回答
0

我想你可以写一个像下面这样的长程序(但我不知道它是否一定更好)

int main(int argc, char* argv[]) {
  using namespace std;
  Egg* egg;
  Nest* nest;
  Hen* hen;

  cout << "Creating new instances on the heap..." << endl;
  try {
    egg = new Egg("New Egg");
  } catch (std::bad_alloc& ba) {
     std::cerr << "bad_alloc caught: " << ba.what() << '\n';
     return 1;
  }

 try {
    nest = new Nest("New Nest");
  } catch (std::bad_alloc& ba) {
     std::cerr << "bad_alloc caught: " << ba.what() << '\n';
     delete egg;
     return 1;
  } 

  try {
    hen = new Hen("New Hen");
  } catch (std::bad_alloc& ba) {
     std::cerr << "bad_alloc caught: " << ba.what() << '\n';
     delete egg;
     delete nest;
     return 1;
  }

  cout << sizeof(*egg) << endl;
  cout << sizeof(*nest) << endl;
  cout << sizeof(*hen) << endl;


  cout << "\nCalling display() on each..." << endl;
  egg->display();
  nest->display();
  hen->display();

  cout << "\nExplicitly deleting each instance..." << endl;
  delete egg;
  delete nest;
  delete hen;


  cout << "\nDone" << endl;
  return 0;
}
于 2015-03-22T16:18:23.787 回答