执行 free() 时出错说 "glibc detected double free or corruption"
Error while executing free() saying "glibc detected double free or corruption"
我正在尝试 运行 使用我用 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;
}
感谢您的帮助
您正在访问您分配的缓冲区的边界之外,这可能会破坏 malloc 数据结构,从而导致您收到错误。这是undefined behaviour.
循环应该是:
for (i = 0; i < nbClients+1; i++)
记住,索引在C中是从0开始的。
当 free()
失败时,这是因为程序中的一些内存损坏,由错误引起。
这里是因为循环for (i = 1; i <= nbClients+1; i++)
访问数组越界
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++)
...
我正在尝试 运行 使用我用 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;
}
感谢您的帮助
您正在访问您分配的缓冲区的边界之外,这可能会破坏 malloc 数据结构,从而导致您收到错误。这是undefined behaviour.
循环应该是:
for (i = 0; i < nbClients+1; i++)
记住,索引在C中是从0开始的。
当 free()
失败时,这是因为程序中的一些内存损坏,由错误引起。
这里是因为循环for (i = 1; i <= nbClients+1; i++)
访问数组越界
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++)
...