我目前正在处理一个经常出现动态数组的 C++ 项目。
我想知道,使用 new-operator 初始化动态数组的正确方法是什么?我的一位同事告诉我,在构造函数中使用 new 是禁忌,因为构造函数是一个不应该容易出错或根本不应该失败的构造。现在让我们考虑以下示例:我们有两个类,一个或多或少复杂的类 State 和一个类 StateContainer,它们应该是不言自明的。

class State {
private:
 unsigned smth;
public:
 State();
 State( unsigned s );
};

class StateContainer {
private:
 unsigned long nStates;
 State *states;
public:
 StateContainer();
 StateContainer( unsigned long n );
 virtual ~StateContainer();
};

StateContainer::StateContainer() {
 nStates = SOME_DEFINE_N_STATES;
 states = new State[nStates];
 if ( !states ) {
  // Error handling
 }
}

StateContainer::StateContainer( unsigned long n ) {
 nStates = n;
 try {
  states = new State[nStates]
 } catch ( std::bad_alloc &e ) {
  // Error handling
 }
}

StateContainer::~StateContainer() {
 if ( states ) {
  delete[] states;
  states = 0;
 }
}

现在实际上,我有两个问题:

1.) 在构造函数中调用 new 是否可以,或者为状态数组创建一个额外的 init()-Method 是否更好,为什么?

2.) 检查 new 是否成功的最佳方法是什么:
if (!ptr) std::cerr << "new failed."

或者
try { /*new*/ } catch (std::bad_alloc) { /*handling*/ }

3.) 好的,它的三个问题 ;o) 在幕后,new 做了某种
ptr = (Struct *)malloc(N*sizeof(Struct));

然后调用构造函数,对吗?

最佳答案

您应该让 std::bad_alloc 传播 - 无论如何,您可能无法做任何合理的事情。

首先,从构造函数 is the only reliable way to signal a problem 抛出异常 - 如果没有异常,则表示对象已完全构造。因此,单独捕获 std::bad_alloc 不会有助于防止其他可能的异常。

那么你能做些什么来“处理”它,让其他代码知道并且可以做出适当的 react ?

正确使用异常(exception) - let them propagate to the site where they can be reasonably handled

关于c++ - 在 C++ 中初始化动态数组的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2743016/

10-10 13:35