在C ++构造函数中使用new运算符是否正确?

时间:2016-11-06 15:36:42

标签: c++ constructor out-of-memory

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构造函数无法分配其内存,会发生什么?

2 个答案:

答案 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 ++想要处理异常情况,所以你不需要编写很多极端情况......但另一方面是角落案例仍然存在,隐含和未说出口。