指向对象指针数组的指针的深层副本

时间:2014-07-31 15:13:37

标签: c++ arrays pointers

编辑:我最初将这个问题脱离了背景,所以我重新设计了它。我已经尽可能地保持不变,所以你的大部分回复仍然适用。

我无法理解如何实现一个接受指向指针数组的指针的构造函数。

我有以下类,其中包含bodies类型的成员Body**(即它是指向正文对象指针数组的指针)。

class Galaxy
{
private:
   int n;          // Number of bodies in galaxy.
   Body** bodies;  // Ptr to arr of ptrs to Body objects.

public:
   Galaxy();
   Galaxy(int, Body**);

   // Some other member functions.
};

以下是构造函数的实现:

// Default constructor. Initializes bodies to null pointer.
Galaxy::Galaxy() : bodies(NULL) {}

// Alternate constructor. Here I try to perform a deep copy of bodiesIn.
Galaxy::Galaxy(int nIn, Body** bodiesIn)
{
   n = nIn;

   // Allocate memory for an array of n pointers to Body objects.
   bodies = new Body*[n];
   // Perform deep copy.
   for (int i=0; i<n; i++)
   {
      bodies[i] = new Body;
      *bodies[i] = *bodiesIn[i];
   }
}

此方法是否合理,或者是否有一种构建此类对象的首选方法。

P.S。我意识到使用std::vector对它进行编码会更容易,但是数组的大小不会改变,并且最小化内存使用很重要。

1 个答案:

答案 0 :(得分:2)

你的功能有很多问题:

  1. 创建一个对象然后立即分配它是效率低下的,而是使用copy ctor。
  2. 如果任何新表达式抛出异常但是第一个或一个赋值,则表示您正在泄漏对象。
  3. 最好选择std::size_t大小,专为它设计。
  4. 更好地交换参数,这更具惯用性。
  5. 您目前不会退回副本
  6. 为什么不模仿它?
  7. BTW:std::unique_ptr不会增加任何开销,但提供了充足的舒适性和安全性。