执行free()时出错" glibc检测到双重释放或损坏"

时间:2016-10-31 07:52:32

标签: c malloc free glibc

我试图使用我用malloc()手动分配的数组来运行程序。我在我的程序结束时释放()这个数组,但我一直收到错误*** glibc detected *** ./test: double free or corruption (!prev): 0x0000000002177010 ***

这是我的主要内容:

int main(int argc, char** argv)
{
    pthread_t t1, t2, t3;
    int i = 1;
    int k = 0;
    Client* clients;
    clients = (Client*) malloc((nbClients+1)*sizeof(Client));
    for (i = 1; i <= nbClients+1; i++)
    {
        printf("\n----TICKET%d----\n", i);
        clients[i].panier = (int*) malloc(nbArticles*sizeof(int));      
        achats(clients[i].panier, &clients[i].ticket);

        for (k = 0; k < nbArticles; k++)
        {
            printf("panier[%d] = %d\n", k, clients[i].panier[k]);

        }

        pthread_create(&t1, NULL, calcMACL, &clients[i]);

        //calcMQUAD(clients[i].panier, &clients[i].ticket);
        //calcMACL(clients[i].panier, &clients[i].ticket);
        //calcMCUBE(clients[i].panier, &clients[i].ticket);

        pthread_join(t1, NULL);
        //free(clients[i].panier);

    }

    free (clients);




    return 0;
}

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

free()失败时,由于错误导致程序中存在一些内存损坏。

在这种情况下,这是因为循环for (i = 1; i <= nbClients+1; i++)访问数组越界。

答案 1 :(得分:1)

您正在访问所分配的缓冲区范围之外,这可能会破坏malloc数据结构,从而导致您获得错误。这是undefined behaviour

循环应该是:

for (i = 0; i < nbClients+1; i++)

请记住,索引从C中的0开始。

答案 2 :(得分:1)

C中的指数从零开始。 clients 的最后一个索引是 nbClients + 1 - 1,这意味着您的循环防护是错误的。我建议对动态数组的长度使用单独的变量,为内存分配使用宏:

#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof (ptr)[0])

int clientsLen = nbClients + 1;
NEW_ARRAY(clients, clientsLen);
for (i = 0; i < clientsLen; i++)
   ...