我遇到了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;
};
};
答案 0 :(得分:2)
代码有点难以阅读,但我看到两个问题:
你也可能在数组范围之外访问内存;内存调试工具(如valgrind)可以帮助您确定是否发生了这种情况。
最简单的解决方案是用std::vector
替换手动管理的数组;那么你不必担心编写自己的析构函数或复制语义。您还可以使用at()
而不是[]
(至少在调试版本中)来提供范围检查访问。
答案 1 :(得分:1)
您没有在默认构造函数中初始化指针。如果你试图破坏默认构造的Heap,它将尝试删除析构函数中的随机内存区域,并且肯定会破坏。