gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:04:21 25 4
gpt4 key购买 nike

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

最佳答案

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

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

也有可能您正在访问数组边界之外的内存;内存调试工具,例如 valgrind可以帮助您确定是否发生了这种情况。

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

关于c++ - 添加析构函数定义会创建运行异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8680280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com