我目前正在处理一个经常出现动态数组的 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/