使用来自operator overloading memory leak的答案,我添加了复制构造函数和复制评估操作符,按照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编译器.
发布于 2015-11-11 04:41:39
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++的创建者说,您应该遵循RIII (称为RIII)。基本上,在创建类时,始终在构造函数中使用新的构造函数,在析构函数中使用删除。避免任何其他功能中的新/删除。传递指针可能很棘手。
https://stackoverflow.com/questions/33650535
复制