在c++构造函数中使用new操作符是否正确?

Is it right to use new operator inside C++ constructor?

本文关键字:是否 操作符 new c++ 构造函数      更新时间:2023-10-16
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++想要处理异常情况,这样你就不需要写很多的极端情况,但另一方面,极端情况仍然存在,隐式的和不言而喻的。