检测到 glibc - 在 C 程序中释放(int ** 类型)时出现双重释放或损坏消息

Posted

技术标签:

【中文标题】检测到 glibc - 在 C 程序中释放(int ** 类型)时出现双重释放或损坏消息【英文标题】:glibc detected - double free or corruption message occur when free (int ** type) in C Program 【发布时间】:2013-04-30 07:51:07 【问题描述】:
int main (void)
   
    int i,j;
int n;
int **P;
int *d;

scanf("%d",&n);

d=(int*)malloc(sizeof(int)*(n+1));

P=(int**)malloc(sizeof(int*)*(n+1));

for(i=0;i<=n+1;i++)
    P[i]=(int*)malloc(sizeof(int)*(n+1));

for(i=0;i<n+1;i++)
    scanf("%d",&d[i]);
minimult(n,d,P);
order(1,n,P);

free(d);
for(i=0;i<n+1;i++)
    free(P[i]);
free(P); //<----------------when execute here!!!!
return 0;

int minimum (int **M,int *d,int i, int j)

int count;
int temp,temp2;
for(count=i;count<=j-1;count++)

    temp=M[i][count]+M[count+1][j]+d[i-1]*d[count]*d[j];
    if(M[i][j]>temp||count==i)
    
    M[i][j]=temp;
    temp2=count;
    

return temp2;




int minimult(int n, int * d, int **P)

int i,j,k,diagonal;
int **M=(int**)malloc(sizeof(int*)*(n+1));
int result;
for(i=0;i<n+1;i++)
    M[i]=(int*)malloc(sizeof(int)*(n+1));
for(i=1;i<=n;i++)
    M[i][i]=0;
for(diagonal=1;diagonal<=n-1;diagonal++)
    for(i=1;i<=n-diagonal;i++)
    
        j=i+diagonal;
        P[i][j]=minimum(M,d,i,j);
    
result=M[1][n];
for(i=0;i<n+1;i++)
    free(M[i]);
free(M); 
return result;

此算法正在解决优化的矩阵乘法顺序。 输入为4 2 3 4 5。 当我删除该行时,它会成功运行。

有什么问题?

【问题讨论】:

请don't cast the return value of malloc() in C。 【参考方案1】:

P[i] 的分配循环中,循环一到多次并覆盖P 分配内存的末尾。将循环条件更改为i &lt; n + 1(或i &lt;= n)。

【讨论】:

以上是关于检测到 glibc - 在 C 程序中释放(int ** 类型)时出现双重释放或损坏消息的主要内容,如果未能解决你的问题,请参考以下文章

如何强制中止“glibc检测到*** free():无效指针”

我收到此错误:“检测到 glibc”

释放 2D 数组 - 检测到堆损坏

C++链表删除节点

链表程序中的双重释放问题

面临错误“检测到 *** glibc *** free(): invalid next size (fast)”