环境:Ubuntu+Linux+gcc
错误:*** glibc detected *** ./server3: free(): invalid pointer: 0x00007f0994a99010 ***
错误原因分析:将malloc()分配的指针被修改以后传给了free()
引用:《C和指针》中关于这个错误有较为详细的叙述,摘取如下:
警告:
当你使用free时,可能会出现各种不同的错误。传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即中止或在晚些时候终止。试图释放一块动态内存的一部分也有可能引起类似的问题,像下面这样:
/*
**Get 10 integers
*/
pi=malloc(10*sizeof(int));
....
/*
**Free only the last 5 integers;keep th**e first 5
*/
free(pi+5);
总结:使用动态内存分配时,稍有不慎出现的问题非常多。而且有些问题甚至是编译器不会出现错误、警告的。所以要严格的遵照规则来办事,不要去涉及那些“阴暗”的角落,不是你的内存你别用。使用malloc、free的正确的模式应该如下:
/*pi是一个指针*/
pi=malloc(10*sizeof(int));
if(NULL==pi)/*尽管分配内存失败这种情况非常少见,但还是要预防*/
{
printf("内存申请失败!\n");
exit(1);
}
......
/*使用完后记得释放,不然会造成内存泄露,这样子会将一点点的榨干可用内存。*/
free(pi);/*记得不要试图释放并非内存分配的内存或者释放一块动态分配的内存的一部分*/
pi=NULL;/*防止动态内存指针被释放后继续被使用*/