class test{
int value;
};
class sample{
sample(){
test *var = new test();
}
};
int main(){
sample foo;
//what will happen here if sample constructor fails to allocate its memory?
}
在C ++构造函数中使用new
运算符是否正确?
如果sample
构造函数无法分配其内存,会发生什么?
答案 0 :(得分:2)
如果示例构造函数无法分配内存,会发生什么?
它会抛出一个std::bad_alloc
异常,可以通过捕获main()
来清理它:
int main() {
try {
sample foo;
// Work with foo ...
}
catch(const std::bad_alloc& ba) {
std::err << "Not enough memory available. Caught 'bad_alloc' exception: '"
<< ba.what() << "'" << std::endl;
}
}
答案 1 :(得分:0)
new
会在失败时抛出bad_alloc
例外。
当构造函数以异常退出时,该对象永远不会到达构造点。它的析构函数不会运行。
如果在构造函数体内抛出异常,则会销毁所有对象的成员变量(通过析构函数调用)。如果从成员的构造函数抛出异常,则前面的成员的析构函数将运行。重点是撤消构造函数到目前为止所做的任何事情,不多也不少。
任何这一点都不应该有任何臭味。请注意成员析构函数将始终正常运行。这可能涉及对类不变量更加挑剔。 C ++想要处理异常情况,所以你不需要编写很多极端情况......但另一方面是角落案例仍然存在,隐含和未说出口。