在c++构造函数中使用new操作符是否正确?
Is it right to use new operator inside C++ constructor?
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++想要处理异常情况,这样你就不需要写很多的极端情况,但另一方面,极端情况仍然存在,隐式的和不言而喻的。
相关文章:
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- sizeof操作符是否优先选择对象而不是类型
- gcc对vla的sizeof操作符的计算方式是否不同
- 是否可以重载*static_cast*操作符?
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 在c++构造函数中使用new操作符是否正确?
- 是否基于其他操作符自动提供任何c++操作符重载
- c++ 11中常量表达式中是否允许使用逗号操作符?
- 是否需要重载类的强制转换操作符?
- 如何检查类型是否存在无参数操作符()
- 是否有方法为任何指针类型定义转换操作符
- 是否有办法为类的指针定义括号操作符?
- 是否可以继承赋值操作符?
- 间接操作符是否更改内存表示
- delete[]操作符是否适用于通过指针返回的动态分配的内存?
- 是否不可能手动调用c++操作符?
- 检测操作符是否存在并可在c++中调用(考虑static_assertions)
- 检查类/结构是否有特定的操作符
- 检查结构体是否为NULL或未设置,即使它的有操作符相等
- 在设计Singleton模式时,赋值操作符是否需要私有?