【问题标题】:Memory-leak when rewriting data (C++)重写数据时内存泄漏 (C++)
【发布时间】:2015-10-25 15:11:38
【问题描述】:

我的代码 (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;


    }

【问题讨论】:

  • 现在仍然很难说出变量名...
  • w2=NULL; delete[]w2; 确实有意义。在将 w2 设置为 nullptr 之前删除它。
  • 更好缩进。代码不应看起来像正弦波。

标签: c++ memory-leaks


【解决方案1】:

看看最后的牵引线 您在删除之前将 w2 设置为 NULL

【讨论】:

  • 大声笑,是的。可悲的是,在此处发布之前,仍然应该通过 OP 调试发现一些东西:(
  • 感谢您指出我不确定这些行,但是在将其设置为 NULL 之前删除 w2 指向的内存似乎并不能解决问题。
  • 我可以修复您版本中的错误,如果您仍然感兴趣,我可以发布它:-)
  • 如果可能的话,我很高兴看到这个!
【解决方案2】:

您在以下循环中更改了指针 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 循环中。

【讨论】:

  • 非常感谢!但是我并没有按照你告诉我的所有事情去做,但实际上我在“delete[]w1;”这一行删除了错误的内存区域。因为我没有向后移动指针 w1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2010-11-11
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多