添加析构函数定义会创建运行异常

时间:2011-12-30 14:07:58

标签: c++

我遇到了struct Heap的析构函数问题。即使只添加一个而不使用它,也会创建一个运行时异常(内存访问)。这是我尝试做的第二天,明天是截止日期。

struct Heap
{
       int n;
       int* tab;
       int* numerWKopcu;

       Heap () { n=0; }
       Heap (int size)  { this->tab = new int[liczbaDomow]; n=0; this->numerWKopcu = new int[2000100];}
       int  max()   { return tab[1]; }
       bool empty() { return n==0; }

       bool insert(int x)
       {
            n++;
            tab[n]=x;
            this->numerWKopcu[x] = n;//ZMIANA
            upHeap(n);
            return true;
       }         

       bool delMin()
       {
            if (n<1) return false;
            this->numerWKopcu[tab[n]] = 1; //ZMIANA
            tab[1]=tab[n]; n--;
            downHeap(1);
            return true;
       }

    void upHeap(int x){ 
        int p;
        int mem = tab[x];
        while (x>1)
        {
            p=x/2;
            if (color[mem]>color[tab[p]]) break;
            this->numerWKopcu[tab[p]] = x; //ZMIANA
            tab[x]=tab[p];
            x=p;
        }
        this->numerWKopcu[mem] = x;//ZMIANA
        tab[x]=mem;
    }

    void downHeap (int x)
    {
        int s=2*x;
        int mem=tab[x];
        while(s<=n)
        {
            if (s+1<=n && color[tab[s]]>color[tab[s+1]])
                s++;
            if (color[mem]>color[tab[s]])
            {
                this->numerWKopcu[tab[s]] = x; //ZMIANA
                tab[x]=tab[s];
                x=s;
                s=2*x;
            }
            else break;
        }
        this->numerWKopcu[mem] = x;//ZMIANA
        tab[x]=mem;
    }

    void write ()
    {
        for (int i=1;i<=n;i++) printf ("%d) %d\n", i, tab[i]);
        printf ("\n");
    }       

    void build()
    {
        int s = n;
        for (s=n/2; s>=1; s--) downHeap(s);
    }
    / ~Heap() {
          delete []this->numerWKopcu;
          delete []this-> tab; 
            }; 
}; 

2 个答案:

答案 0 :(得分:2)

代码有点难以阅读,但我看到两个问题:

  • 您没有在默认构造函数中初始化指向null的指针,因此销毁默认构造的对象会产生未定义的行为;
  • 您没有定义或删除复制构造函数和复制赋值运算符(正如您根据Rule of Three定义析构函数时应该这样做),因此销毁复制的对象会产生未定义的行为。

你也可能在数组范围之外访问内存;内存调试工具(如valgrind)可以帮助您确定是否发生了这种情况。

最简单的解决方案是用std::vector替换手动管理的数组;那么你不必担心编写自己的析构函数或复制语义。您还可以使用at()而不是[](至少在调试版本中)来提供范围检查访问。

答案 1 :(得分:1)

您没有在默认构造函数中初始化指针。如果你试图破坏默认构造的Heap,它将尝试删除析构函数中的随机内存区域,并且肯定会破坏。