这个加法类会导致内存泄漏吗?

时间:2012-04-28 08:34:09

标签: c++ memory overloading memory-leaks operator-keyword

以下是可用于+操作的类的示例。

class A
{
public:
   int *array;

   A()
   {
      array = new int[10];
   }

   ~A()
   {
      delete[] array;
   }

   A operator+ (const A &b)
   {
      A c;
      for(int i=0; i<10; i++)
         c.array[i] += array[i] + b.array[i];
      return c;
   }
};

int main()
{
   A a,b,c,d;

   /* puts some random numbers into the arrays of b,c and d */
   a = b+c+d;
}

在复制a的结果之前,b+c+d会运行析构函数吗?如果没有,我如何确保没有内存泄露?

+运算符重载是以这种方式设计的,因此不会修改操作数。

2 个答案:

答案 0 :(得分:9)

您需要向A添加一个等于运算符。此外,您将likely want to create a copy constructor

当a变为从b + c + d返回时,array中的a指针在没有delete[]被调用的情况下被覆盖。您需要创建一个删除array的运算符=。

运营商=的示例如下:

A& operator=(A const& a)
{
    if (&a != this) {
        int* tmp = this->array;
        this->array = new int[10];
        //copy a.array to this->array
        delete[] tmp;
    }
    return *this;
}

如果你是operator=的新手,这里有很多细微之处。

特别是,检查a是否等于this是必要的,因为写它是完全有效的:

A a;
a = a;

这会导致无意义的副本,在大多数情况下operator=都会导致错误。

另一个微妙的要求不是一个或多个编码风格(虽然是一个非常广泛的标准)。复制动态分配的内容时,您总是希望在发布之前进行分配和复制。这样,如果new抛出一个异常(或其他东西失败),该对象仍然处于稳定状态,尽管它的旧数据而不是新的预期日期。

答案 1 :(得分:2)

  

这会导致内存泄漏吗?

是的,它会的。您忘了添加复制构造函数和赋值运算符。 See Rule of Three

您也可以std::vector<int>使用A::array代替int*。在这种情况下,您不必担心复制构造函数/赋值运算符(只要您不添加必须在destrcutor中处理的其他内容)。