我正在从事一个C++项目,其中频繁出现动态数组。 我想知道使用new运算符初始化动态数组的正确方法是什么?我的同事告诉我,在构造函数中使用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是否可以,还是最好为State-Array创建一个额外的init()方法?为什么?
2.) 检查new是否成功的最佳方法是什么:
if (!ptr) std::cerr << "new failed."
或者
try { /*new*/ } catch (std::bad_alloc) { /*handling*/ }
3.) 好的,有三个问题 ;o) 在内部实现上,new 关键字会执行一些操作
ptr = (Struct *)malloc(N*sizeof(Struct));
然后调用构造函数,对吗?
vector
吗? - GManNickGnew
是完全可以接受的。 - Nathan Ernst