我目前正在开发一个经常出现动态数组的C++项目。 我想知道,什么可能是正确的方式来初始化动态数组使用新的运算符?我的一位同事告诉我,在构造函数中使用new是不允许的,因为构造函数是一个不应该容易出错或者不应该失败的构造函数。现在我们来考虑下面的例子:我们有两个类,一个或多或少复杂的类State和一个StateContainer类,应该自我解释。在C++中初始化动态数组的正确方法
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)它是确定,在构造函数中调用新的,或者是更好地创建一个额外的init() - 为状态 - 法数组和为什么?
2)请告诉我要检查的最好的方式,如果新的成功:
if (!ptr) std::cerr << "new failed."
或
try { /*new*/ } catch (std::bad_alloc) { /*handling*/ }
3)确定的三个问题; O)引擎盖下,新做某种
ptr = (Struct *)malloc(N*sizeof(Struct));
然后调用构造函数吧?
我假设你不能使用'VECTOR'? – GManNickG 2010-04-30 07:51:50
你是同事是错的。在构造函数中使用'new'完全可以接受。 – 2010-04-30 15:19:54