1

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

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吗?如果没有,我如何确保没有内存泄漏?

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

4

2 回答 2

9

您需要向 A 添加一个等号运算符。此外,您可能希望创建一个复制构造函数

当 a 变成 b+c+d 的返回值时,array指针 ina会被覆盖而delete[]不会被调用。您需要创建一个 operator= 来删除array.

operator= 的示例如下:

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=.

特别是,检查是否athis于是必要的,因为这样写是完全有效的:

A a;
a = a;

这将导致无意义的复制,并且在大多数情况下operator=会导致错误。

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

于 2012-04-28T08:38:30.197 回答
2

这会导致内存泄漏吗?

是的,它会。您忘记添加复制构造函数和赋值运算符。见三法则

You could also use std::vector<int> for A::array instead of int*. In this case you wouldn't need to worry about copy constructor/assignment operator (as long as you don't add something else that must be handled in destrcutor).

于 2012-04-28T08:48:56.167 回答