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
构造函数分配内存失败,会发生什么?
如果示例构造函数分配内存失败会发生什么?
它将抛出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;
}
}
new
将在失败时抛出bad_alloc
异常。
当构造函数异常退出时,对象永远不会到达被构造的点。它的析构函数不运行。
如果在构造函数体中抛出异常,则销毁对象的所有成员变量(通过析构函数调用)。如果从成员的构造函数抛出异常,则运行前面成员的析构函数。关键是撤销构造函数到目前为止所做的一切,不多也不少。
这些都不应该有什么臭味。一定要注意,成员析构函数的行为总是正确的。这可能涉及对类不变量更加挑剔。c++想要处理异常情况,这样你就不需要写很多的极端情况,但另一方面,极端情况仍然存在,隐式的和不言而喻的。