在这个琐碎的例子中安全地召唤新的最佳方式?

时间:2015-03-22 16:08:50

标签: c++ bad-alloc

对于一个学校项目,我有3个班:一个鸡蛋,一个巢和一个母鸡。我们需要使用newmain中创建每个实例,在每个上调用display(),然后明确删除每个实例。这很容易。

我的问题是不知道如何正确捕捉bad_alloc;任何new来电都应该被抛出。

现在,它看起来像这样:

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,然后只抓一个bad_alloc,然后调用{{1在每个实例上,但后来我想到了以下场景:

  • delete已成功创建
  • egg失败,并抛出nest

如果我此时调用所有3上的删除,bad_alloc应该抛出另一个例外,因为它从未在第一时间分配,因此它不能自由

我理所当然地知道,你不会像这样在公开场合使用hen,但是处理这种情况的最佳方法是什么?是否过于琐碎和人为,无法妥善处理?

2 个答案:

答案 0 :(得分:6)

你可以这样做

  1. 首先声明它们。设置为nullptr
  2. 启动试用块
  3. 分配。
  4. Catch - 删除它们 - 删除nullprt是noop

答案 1 :(得分: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;
}