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

Car*_*ate 6 c++ bad-alloc

对于一个学校项目,我有3个班:一个鸡蛋,一个巢和一个母鸡.我们需要使用new创建每个in的实例,对每个实例进行main调用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;

}
Run Code Online (Sandbox Code Playgroud)

我想把整个块从第一个块包装newdelete一个try块中,然后只是捕获一个bad_alloc,并调用delete每个实例,但后来我想到了以下场景:

  • egg 已成功创建
  • nest 失败了,扔了一个 bad_alloc

如果此时我在所有3上调用delete,hen则应抛出另一个异常,因为它从未在第一个位置分配,所以它不能被释放.

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

Ed *_*eal 6

你可以这样做

  1. 首先声明它们.调成nullptr
  2. 启动try块
  3. 分配.
  4. 捕获 - 删除它们 - 删除nullprt是一个noop