C++ 此添加类是否会导致内存泄漏?

C++ 此添加类是否会导致内存泄漏?,c++,memory,overloading,memory-leaks,operator-keyword,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]

下面是一个可用于
+
操作的类的示例

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类
{
公众:
int*数组;
()
{
数组=新整数[10];
}
~A()
{
删除[]数组;
}
A操作员+(常数A和b)
{
A c;

对于(inti=0;i,您需要向A添加一个等于运算符。此外,您还需要

当a成为b+c+d的返回值时,
a
中的
array
指针将被重写,而不会对其调用
delete[]
。您需要使运算符=删除
数组

运算符=的示例如下所示:

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引发异常(或其他内容失败),对象仍处于稳定状态,但使用的是旧数据,而不是新的预期日期。

您需要向a添加一个equals运算符。此外,您还需要

当a成为b+c+d的返回值时,
a
中的
array
指针将被重写,而不会对其调用
delete[]
。您需要使运算符=删除
数组

运算符=的示例如下所示:

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引发异常(或其他内容失败),对象仍处于稳定状态,但使用的是旧数据,而不是新的预期日期

这会导致内存泄漏吗

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

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

这会导致内存泄漏吗

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


你也可以用
std::vector
来代替
A::array
而不是
int*
。在这种情况下,你不需要担心复制构造函数/赋值操作符(只要你不添加其他必须在析构函数中处理的内容)。

接受的答案有什么问题吗?为什么要使用
new int[10] 
而不是
std::vector
?我假设这只是一个尝试理解的示例,但如果这是真实的代码,您可以定义
int数组[10]
然后就不必担心是否正确删除了。@Johnsyweb答案很好,但这只是一个我未经深思熟虑就草拟的示例。这个示例无法表明我对其他答案的看法。@Corbin在我现在正在编写的代码中,构造函数接收一组整数,用于分配一定大小的数组。啊。如果您已经在使用标准容器,那么Johnsyweb是对的;您应该只使用向量。接受的答案有什么问题?为什么要使用
new int[10]
而不是
std::vector
?我假设这只是一个尝试理解的示例,但如果这是真实的代码,您可以定义
int数组[10]
然后就不必担心是否正确删除了。@Johnsyweb答案很好,但这只是一个我未经深思熟虑就草拟的示例。这个示例无法表明我对其他答案的看法。@Corbin在我现在正在编写的代码中,构造函数接收一组整数,用于分配一定大小的数组。啊。如果您已经在使用标准容器,那么Johnsyweb是正确的;您应该使用向量。