创建类变量时内存泄漏

memory leak during creating class variable

本文关键字:泄漏 内存 类变量 创建      更新时间:2023-10-16

使用运算符重载内存泄漏的答案我添加了复制构造函数和复制辅助运算符,按照NathanOliver的建议更改了运算符+(),现在我将传递给构造函数静态数组。仍然存在内存泄漏,奇怪的是,即使主要只有类变量初始化,我也会出现内存泄漏,不管是否有参数。。。有什么建议吗?我认为cunstructor是有效的。

Set::Set(int n, int* array){
   number = n; 
   elems = array;
   std::sort(elems, elems + number);
}
Set::Set(const Set& s){
   number=s.number;
   elems=s.elems;
}
Set& operator=(const Set& X){
   if(this==&X)
     return *this;
   delete [] elems;
   elems=X.elems;
   number=X.number;
   return *this;

我使用gcc(tdm64-2)4.8.1编译器。

c++中有两种拷贝,浅拷贝和深拷贝。第一个只复制指针,后面的复制值。默认情况下,如果由编译器生成,复制构造函数和重载赋值运算符将执行浅复制。现在让我们来看看您的代码。

Set::Set(int n, int* array){
   number = n; 
   elems = array;
   std::sort(elems, elems + number);
}

此构造函数接受一个in数组。如果这个数组是使用new在堆上分配的,那么应该使用delete[]来解除分配。现在声明:

 elems = array;

是一个浅拷贝,它实际上拷贝的是指针而不是值。所以,如果您不小心在main中删除了数组,那么elem将成为一个悬空指针,因为它将指向一个已删除的数组。在此之后取消引用或删除elem将具有未定义的行为。

现在同样适用于此:

Set& operator=(const Set& X){
   if(this==&X)
   return *this;
   delete [] elems;
   elems=X.elems;
   number=X.number;
   return *this;
}

你再做一次浅层复制,你只是复制指针。为了解决这个问题,你需要

delete[] elems;
elems = new int[n]; //where n is x.elems length
//use memcpy() function or a for loop to copy the values of x.elems

最后在类中添加一个类析构函数:

~Set() {
     if(elems != nullptr) //check for empty array
         delete[] elems;
 }

记住bjarnestroustrup,c++的创建者说你应该遵循RIII(称为R tripple i)。基本上,当你创建一个类时,总是在构造函数中使用new,在析构函数中使用delete。避免在任何其他功能中新建/删除。传球可能很棘手。