C ++初始化列表和内存分配

时间:2009-10-08 12:32:29

标签: c++ constructor memory-management smart-pointers initialization-list

以下是否有效?

class myClass
{
   private:
     ...
     int m_nDataLength;
     boost::shared_array<int> m_pData;
     ...

   public:
     myClass(): ..., m_nDataLength(10), m_pData(new int[m_nDataLength]), ...
     {
     }
}

我是否正确地假设初始化将完全按照我在ctor中给出的顺序发生?如果没有,如果m_npL的初始化发生在m_pData的后面怎么办?

3 个答案:

答案 0 :(得分:10)

虽然示例中的初始化确实按照您想要的顺序发生,但这并不是您假设的原因:初始化按类定义中的数据成员声明的顺序发生。 这样做的原因是析构函数必须以向后的顺序销毁成员,而不管使用哪个构造函数来创建对象。为此,必须使用与构造函数无关的定义构造顺序的方法。

这意味着,如果不是

class myClass
{
   private:
     ...
     int m_nDataLength;
     boost::shared_array<int> m_pData;

有人会将您的代码更改为

class myClass
{
   private:
     ...
     boost::shared_array<int> m_pData;
     int m_nDataLength;

然后代码就会出错。

我的建议是:

  • 编写构造函数,以便初始化顺序无关紧要。
  • 如果你不能这样做(请注意:在过去的十年中发生这种情况的次数不到5次),请在声明数据成员时明确说明。

这样的事情应该做:

class myClass
{
   private:
     ...
     int m_nDataLength;                 // Note: Declaration order
     boost::shared_array<int> m_pData;  //       matters here!

答案 1 :(得分:9)

初始化将按类中的顺序初始化字段,因此:如果更改

private:
  ...
  int m_nDataLength;
  boost::shared_array<int> m_pData;

作为

private:
  ...
  boost::shared_array<int> m_pData;
  int m_nDataLength;
它不会工作。在构造函数中,订单不适用。

答案 2 :(得分:5)

不,类成员的初始化按成员出现在类定义中的顺序进行。如果成员出现在初始化列表中,那么它控制用于初始化该成员的表达式(即使它使用尚未初始化的成员),但它在初始化列表中出现的位置不会影响初始化时间。< / p>