对于一个学校项目,我有3个班:一个鸡蛋,一个巢和一个母鸡。我们需要使用new
在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;
}
我想将整个块从new
块中的第一个delete
包裹到最后try
,然后只抓一个bad_alloc
,然后调用{{1在每个实例上,但后来我想到了以下场景:
delete
已成功创建egg
失败,并抛出nest
如果我此时调用所有3上的删除,bad_alloc
应该抛出另一个例外,因为它从未在第一时间分配,因此它不能自由
我理所当然地知道,你不会像这样在公开场合使用hen
,但是处理这种情况的最佳方法是什么?是否过于琐碎和人为,无法妥善处理?
答案 0 :(得分:6)
你可以这样做
nullptr
答案 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;
}