【问题标题】:Will this addition class cause a memory leak?这个添加类会导致内存泄漏吗?
【发布时间】:2012-04-28 08:34:09
【问题描述】:

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

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 的结果之前运行析构函数吗?如果没有,如何确保没有内存泄漏?

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

【问题讨论】:

  • your previous question 接受的答案有什么问题?为什么你使用new int[10] 而不是std::vector
  • 我假设这只是一个试图理解的示例,但如果这是真实代码,您可以只定义int array[10];,然后不必担心正确删除。
  • @Johnsyweb 答案很好,但这只是我草拟的一个例子,我没有多想。这个例子并不代表我对其他答案的看法。
  • @Corbin 在我现在正在处理的代码中,构造函数接收一组整数,用于分配一定大小的数组。
  • 啊。如果您已经在使用标准容器,那么 Johnsyweb 是对的;你应该只使用一个向量。

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


【解决方案1】:

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

当 a 变成 b+c+d 的返回值时,a 中的 array 指针会被覆盖,而不会调用 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= 的新手,这其中有很多微妙之处。

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

A a;
a = a;

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

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

【讨论】:

    【解决方案2】:

    这会导致内存泄漏吗?

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

    您也可以将std::vector&lt;int&gt; 用于A::array,而不是int*。在这种情况下,您无需担心复制构造函数/赋值运算符(只要您不添加必须在 destrcutor 中处理的其他内容)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多