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

C++ 添加析构函数定义会创建运行异常,c++,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->numerWK

我对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; 
            }; 
}; 
struct堆
{
int n;
int*选项卡;
int*numerWKopcu;
堆(){n=0;}
堆(int size){this->tab=newint[liczbaDomow];n=0;this->numerWKopcu=newint[2000100];}
int max(){return tab[1];}
bool empty(){返回n==0;}
布尔插入(整数x)
{
n++;
tab[n]=x;
this->numerWKopcu[x]=n;//ZMIANA
ap(n);
返回true;
}         
布尔·德尔明()
{
如果(nnumerWKopcu[tab[n]]=1;//ZMIANA
表[1]=表[n];n--;
下堆(1);
返回true;
}
无效的ap(int x){
INTP;
int mem=tab[x];
而(x>1)
{
p=x/2;
if(color[mem]>color[tab[p]])中断;
this->numerWKopcu[tab[p]]=x;//ZMIANA
tab[x]=tab[p];
x=p;
}
this->numerWKopcu[mem]=x;//ZMIANA
tab[x]=mem;
}
无效下堆(int x)
{
int s=2*x;
int mem=tab[x];
while(scolor[选项卡])
{
this->numerWKopcu[tab[s]]=x;//ZMIANA
制表符[x]=制表符[s];
x=s;
s=2*x;
}
否则就断了;
}
this->numerWKopcu[mem]=x;//ZMIANA
tab[x]=mem;
}
无效写入()
{
对于(inti=1;i=1;s--)下堆;
}
/~Heap(){
删除[]此->数值OPCU;
删除[]此->选项卡;
}; 
}; 

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

代码有点难读,但我发现两个问题:

  • 您没有在默认构造函数中初始化指向null的指针,因此销毁默认构造的对象会产生未定义的行为
  • 您不定义或删除复制构造函数和复制赋值运算符(如果您根据定义析构函数,则应始终这样做),因此销毁复制的对象会产生未定义的行为
也可能您正在访问数组边界以外的内存;一个内存调试工具(如)可以帮助您确定是否发生了这种情况


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

请发布准确的错误消息…此代码不完整(
liczbaDomow
未定义),并且使用非英语变量名。这两种代码一起使人们很难帮助您您您您尝试过在调试器中运行它吗?您拥有原始指针,并且没有遵循“三个规则”旁白:每个在Stack Overflow上发帖的人都想要一个答案,而且大多数人都希望尽快得到答案,所以像“明天是最后期限”这样的评论不会赢得你太多的同情,可能会被视为要求很高。最好把它们忽略掉。它从未被使用过。我将它改为:Heap(){n=0;this->tab=new int[liczbaDomow];this->numerWKopcu=new int[2000100];}但错误在选项卡[n]中保持不变=插入函数中的x。计算机不知道x和n,它是用于ASD算法和数据结构的。我不允许使用#include#include之外的任何东西。我甚至没有初始化刚刚定义的析构函数。@RobertKilar:如果你发布一个简短的、可编译的程序来重新生成这就是问题所在。事实上,除了指出明显的问题之外,很难做更多的事情。好的。谢谢各位,我刚刚决定不使用delete,因为它成本太高。我刚刚初始化了int[2000100]因为这就是我所需要的,程序从20秒提高到了0.3秒。整个代码有394行,所以不可读。谢谢大家的帮助!但我还有一个问题。删除多少[]标签费用?@RobertKilar:这取决于很多事情,但在现代PC上通常是一微秒。不删除东西的成本是最终会耗尽内存。