使用来自运算符重载内存泄漏的答案,我添加了复制构造函数和复制赋值运算符,按照NathanOliver的建议更改了operator +(),现在我将传递给构造函数静态数组。仍然有内存泄漏,奇怪的是,即使在主目录中只有类变量初始化时,我还是得到了此内存泄漏,是否与参数无关...有什么建议吗?我认为讲师是有效的。
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;
}
请记住,c ++的创建者bjarne stroustrup说您应该遵循RIII(称为Rtripple i)。基本上,当您创建类时,请始终在构造函数中使用new并在析构函数中删除。避免在任何其他功能中使用new / delete。传递指针可能很棘手。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句