在这个简单的例子中安全地调用 new 的最佳方法是什么?
Best way to safely call new on this trivial example?
对于一个学校项目,我有 3 个 类:一个鸡蛋、一个窝和一只母鸡。我们需要使用 new
在 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
,但是处理这种情况的最佳方法是什么?是不是太琐碎太做作了,不好处理?
你可以做到
- 先声明它们。设置为
nullptr
- 启动try块
- 分配。
- 捕获 - 删除它们 - 删除 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;
}
对于一个学校项目,我有 3 个 类:一个鸡蛋、一个窝和一只母鸡。我们需要使用 new
在 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
,但是处理这种情况的最佳方法是什么?是不是太琐碎太做作了,不好处理?
你可以做到
- 先声明它们。设置为
nullptr
- 启动try块
- 分配。
- 捕获 - 删除它们 - 删除 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;
}