c++ - 运算符重载内存泄漏

标签 c++ vector operator-overloading

最近我有一个任务要用 C++ 完成,用 union 、交集等作为重载运算符实现一个 Set 类。我在重载 operator+() 时遇到了问题。我决定使用 vector 并利用一些算法的库函数。问题是我必须将数组指针和数组大小传递给构造函数。这让这个任务有点复杂......我可以编译它但是在“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 编译器。

最佳答案

  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;
  }

您创建一个 vector ,对其进行修改,然后将 elems 设置为指向该 vector 包含的内容。问题是当 vector 在函数结束时被销毁时, vector 持有的内存被释放。所以你现在有一个指向你不再拥有的内存的指针。试图用它做任何事情都是未定义的行为。你可以做的是创建一个新数组,将 vector 的元素复制到数组中,然后将新数组分配给 `elems

Set Z;
Z.number= v.size();
Z.elems= new int[z.number];
for (int i = 0; i < Z.number; i++)
    Z.elems[i] = v[i];

return Z;

其次,您需要为您的类定义一个复制构造函数和赋值运算符。要做到这一点引用:What is The Rule of Three?

关于c++ - 运算符重载内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33636952/

相关文章:

c++ - 为什么多态性在这种情况下不起作用?

c++ - 插入 map 库无效

c++ - boost::variant 的树状容器——有什么缺点吗?

c++ - 打开流的多个文本文件

matlab - 如何将多个行向量与矩阵进行比较?

C++是否可以重载右值引用的一元减号运算符?

typescript - Typescript 有运算符重载吗?

c++ - QMainWindow 不显示 Qwidgets 背景

c++ - 用ASCII算法简单画图

c++ - 如何同时检查多个索引的 `std::vector<bool>` 是否为真?