在这个简单的例子中安全地调用 new 的最佳方法是什么?

Best way to safely call new on this trivial example?

对于一个学校项目,我有 3 个 类:一个鸡蛋、一个窝和一只母鸡。我们需要使用 newmain 中创建每个的实例,对每个调用 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 块中,然后只捕获一个 bad_alloc,然后调用 delete 在每个实例上,但后来我想到了以下场景:

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

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

你可以做到

  1. 先声明它们。设置为 nullptr
  2. 启动try块
  3. 分配。
  4. 捕获 - 删除它们 - 删除 nullprt 是一个 noop

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

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;
}