无法解释的malloc.c:2401:sysmalloc:断言错误

时间:2018-11-16 01:10:50

标签: c++ c++11

我向您挑战,以找出导致我的程序中断的原因,我一直在努力寻找背后的原因,但我什至都找不到。

我的程序应该从文件中读取值,并根据读取的内容创建2个矩阵:文件上的第一个值是行,第二个是cols。 (然后,它应该执行一些算法,但效果很好,在此之前会失败)

所以这是我的问题:当行值为30时,运行程序 时,我不断收到以下错误消息。我无法找到导致失败的单个值,而不是30。我想解决这个问题,但是我找不到导致程序开始失败的原因,我不知道还有什么尝试。我调试了它,并且从文件中读取了所有信息之后创建第一个矩阵时程序失败。

    potter: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

最有趣的是,在添加最后一个功能之前,程序运行正常。我必须在不注意的情况下更改了某些内容并破坏了程序(我没有任何旧版本,并且删除该功能也无济于事)

如果有人感兴趣,这里是指向孔代码和测试文件的链接:https://drive.google.com/open?id=1tcKXainj021fwjAAGN3cNdsU50p2Neou

编辑:程序在代码的以下部分失败

M=new int * [n+1]                  
        if(M){                             
                for(int i=0; i<=n;i++){       
                        M[i]=new int [T+1];   
                        if(!M[i]){       
                                cerr<<"Error";
                                exit(-1);
                        }
                }
                for(int i=0;i<n+1;i++)
                        for(int j=0;j<T+1;j++)
                                M[i][j]=-1;
        }else{
                cerr<<"Error";
                exit(-1);
        }

在尝试执行M [i] = new int [T + 1]时具体地;当i = 10时,如果n = 30


已解决

问题是循环会事先超出分配的内存,从而损坏它并导致程序稍后失败。

 decisions=new int [n];
                for(int i=0;i<=n;i++)
                        decisions[i]=0;

老实说,我不知道该程序在执行类似操作后不会失败。 (这可以通过在Decision = new int [n + 1]中将n更改为n + 1来轻松解决;)

1 个答案:

答案 0 :(得分:1)

很有可能您所做的某些操作破坏了malloc数据结构。这可能是通过重用释放的指针,使分配的数据溢出(从而粉碎了malloc使用的小头)或无意释放了一个不指向malloc的数据头的指针。

有一个名为valgrind的可爱工具,对这类事情非常有用。