【发布时间】:2025-12-24 19:55:07
【问题描述】:
最近我有一个任务要在 C++ 中完成,实现一个带有联合、交集等作为重载运算符的 Set 类。我遇到了重载运算符+()的问题。我决定使用向量并利用一些算法的库函数。问题是我必须将数组指针和数组大小传递给构造函数。这使这个任务有点复杂......我可以编译它,但是在“z = a + b”操作期间我遇到了某种内存泄漏。谁能解释我做错了什么?
class Set {
int number; // array size (can't be changed)
int *elems; // array pointer (same)
public:
Set();
Set(int, int*); // (can't be changed)
~Set();
friend Set operator+(const Set& X,const Set& Y){
std::vector<int> v(X.number+Y.number);
std::vector<int>::iterator it;
it=std::set_union (X.elems, X.elems+X.number, Y.elems, Y.elems+Y.number, v.begin());
v.resize(it-v.begin());
Set Z;
Z.number=v.size();
Z.elems=&v[0];
return Z;
}
};
Set::Set(){};
Set::Set(int n, int* array){
number=n;
elems = array = new int[number];
for(int i=0; i<number; i++) // creating Set
std::cin >> elems[i];
std::sort(elems, elems + number);
}
Set::~Set(){
delete[] elems;
}
int main(){
int* pointer;
Set z;
Set a = Set(5, pointer);
Set b = Set(2, pointer);
z=a+b;
}
我添加了复制构造函数和复制分配,按照 NathanOliver 的建议更改了 operator+(),现在我将传递给构造函数静态数组。仍然有内存泄漏,奇怪的是我得到了这个内存泄漏,即使在 main 中只有类变量初始化,是否有参数都没关系......有什么建议吗?我认为 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 编译器。
【问题讨论】:
-
你需要定义一个赋值运算符。
-
Set构造函数不应该创建elems来自array吗?你为什么读std::cin? -
构造函数中指针的作用是什么?您只分配本地值,从不读取传入的内容。
-
@Barry,Kevin,如果我将传递给构造函数填充数组,数字变量的用途是什么?对我来说,这有点不合逻辑,但这些都是任务条件。或者也许我错过了那种方法?
-
@Saris 所以你知道数组中有多少东西。你不能仅仅从一个指针中得到它。
标签: c++ vector operator-overloading