每当调用析构函数时,我都会收到一条奇怪的消息。由于我的私有变量之一是动态分配的数组(int *member;),所以我这样写析构函数:

ClassSet::~ClassSet(){delete []member;}


每次调用ClassSet的析构函数时,我都会收到一条错误消息:


  Windows已在Hw1.exe中触发一个断点。
  
  这可能是由于堆损坏所致,这表明Hw1.exe或其已加载的任何DLL中存在错误。
  
  这也可能是由于用户在Hw1.exe具有焦点时按下了F12。


全班:

class ClassSet
{
  public:
    ClassSet(int n = DEFAULT_MAX_ITEMS);
ClassSet(const ClassSet& other);
ClassSet &operator=(const ClassSet& other);
~ClassSet();
  private:
    int size;
int *member;
 };

ClassSet::ClassSet(int n){
   size = n;
   member = new int[n];
}

ClassSet::ClassSet(const ClassSet& other){
    int i = 0;
    this->size = other.size;
member = new int [capacity];
while (i<size)
{
    this->member[i] = other.member[i];
    i++;
}
 }

 Multiset& Multiset::operator=(const Multiset &other)
 {
    if (&other == this){return *this;}
this->size = other.size;
int i = 0;
    delete [] member;
    member = new int[size];
while (i<other.size)
{
    this->member[i] = other.member[i];
    i++;
}
return *this;
}


知道这个析构函数怎么了吗?

最佳答案

您未能实现(或实现不正确)ClassSet::ClassSet(const ClassSet&)ClassSet::operator=(const ClassSet&)之一。

换句话说,您违反了Rule of Three

但是,最好的解决方案可能不是实现它们,而是更改为动态数组分配空间的方式。尝试使用new[]替换该成员,而不是使用delete[]std::vector<>

09-20 17:45