对象生命周期:构造函数调用结束后,析构函数调用之前。
类的非托管成员变量(自己new出来的对象、数组等等),永远不要写到初始化列表中
例:
class InilException
{
public:
InilException();
virtual ~InilException();
public:
int* m_array;
};
类InilException中含有非托管的成员变量 m_array;
构造函数
InilException::InilException()
:m_array(new int[10])
{
}
InilException::~InilException()
{
delete [] m_array;
}
上述是一个错误写法。
如果InilException在构造函数中抛出了异常,那么没有机会释放m_array。原因是构造函数并未执行结束,对象没有真实存在,自然不会调用到析构函数。
由于VC6不支持Function try block。所以也无法对初始化列表加以异常捕捉。
例如
class Unlucky
{
public:
Unlucky()
{
throw 1;
}
};
class InilException
{
public:
InilException();
virtual ~InilException();
public:
int* m_array;
Unlucky m_u;
};
InilException::InilException()
:m_array(new int[10]),
m_u()
{
}
InilException::~InilException()
{
delete [] m_array;
}
会产生内存泄漏。
正确方法
1 使用智能指针。
2
InilException::InilException()
:m_array(NULL),
m_u()
{
try
{
m_array = new int[10]
}
catch(...)
{
delete m_arrray;
}
}