我的代码(C ++)问题导致内存泄漏(我相信)。基本上我希望它能做到以下几点:从用户那里获取数据,直到他写完"停止"并从该数据中生成堆。我想我在某些时候错过了预订内存的删除但我不知道如何解决它。此外,代码似乎在code :: blocks中工作,但它在Dev C ++中崩溃。
cout<<"Enter data to heap if u wanna stop write stop."<<endl;
int *w1=new int[1];
int kek=0;
while(true)
{
cin>>*(w1);
if (!cin)
{ /// the "stop"" thingy
w1=w1-kek;
cout<<"heap: "<<endl;
for (int i=0;i<kek;i++)
{
cout<<" "<<*w1<<" ";
w1++;
}
break;
}
int *w2=new int[2+kek];
w1=w1-kek;
for(int t=0;t<kek+1;t++) ///rewriting data to new chunks of memory
{
*w2=*w1;
w2++;
w1++;
}
delete[]w1; ///releasing old ones ( i think something is wrong here)
w1=w2;
kek++;
w1=w1-kek-1;
int kekkeeper=kek;
for(int l=log(kek)/log(2);l>0;l--) /// heapnig things up
{
if(*(w1+kekkeeper/2)>*(w1+kekkeeper)) swap (*(w1+kekkeeper/2),*(w1+kekkeeper));
else break;
kekkeeper=kekkeeper/2;
}
w1=w1+kek+1;
w2=NULL;
delete[]w2;
}
答案 0 :(得分:2)
看看最后的拖车线 在删除之前将w2设置为NULL
答案 1 :(得分:0)
您在以下循环中更改了指针w1和w2
for(int t=0;t<kek+1;t++) {
*w2=*w1;
w2++;
w1++;
}
因此您必须在删除之前为每个指针重置此修改。 w1的重置指令可能如下所示
w1=w1-(kek+1);
delete[]w1;
和w2这样的
w2=w2-kek;
delete[]w2;
最后你必须将w1的分配移动到while循环中。