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

标签 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_nDataLength 的初始化发生在 m_pData 之后怎么办?

最佳答案

虽然您的示例中的初始化确实按照您希望的顺序进行,但这并不是您假设的原因:初始化按照类定义中数据成员声明 的顺序进行。 这样做的原因是无论使用哪个构造函数创建对象,析构函数都必须按倒序销毁成员。为此,必须使用独立于构造函数的方式来定义构造顺序。

这意味着,如果不是

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!

关于C++ 初始化列表和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537518/

相关文章:

c++ - 无限执行boost asio async_read_until

c++ - 为什么调试器抛出 "read access violation. this was nullptr"异常?

C++ 继承-子类构造函数调用?

android - EditText 导致内存泄漏

c++ - CMake + Qt 创作者 : Add header files to project files

c++ - 如果 count() 是 constexpr 函数,为什么 std::array<int, count()> 不能编译?

java - C++ 与 Java 原始浮点类型

c# - 在 C# 中是否可以强制只能从构造函数调用私有(private)函数?

Java - 在函数内部创建具有常量值的字符串

Cocoa 内存管理 NSArray 与对象