6

学校のプロジェクトでは、卵、巣、鶏の 3 つのクラスがあります。を使用newして each のインスタンスを作成し、each を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, をキャッチして各インスタンスbad_allocを呼び出すdeleteことを考えましたが、次のシナリオを考えました。

  • egg正常に作成されました
  • nest失敗し、bad_alloc

この時点で 3 つすべてに対して delete を呼び出すとhen、そもそも割り当てられていないため、別の例外がスローされるはずです。したがって、解放することはできません。

理想的には、newこのようにオープンに使用しないことはわかっていますが、この状況を処理する最善の方法は何ですか? 適切に処理するにはあまりにも些細で人工的すぎますか?

4

2 に答える 2

6

あなたはこれを行うことができます

  1. それらを最初に宣言します。に設定nullptr
  2. try ブロックを開始する
  3. 割り当てる。
  4. キャッチ - それらを削除 - 削除 nullprt はヌープです
于 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 に答える