double free or corruption (out): 0x00000000011abe70 ***
两种常见情况:
-
内存重复释放,看程序中是否释放了两次空间
-
内存越界。数组访问越界,超出范围。
大部分是第二种情况,正常应该不会重复释放两次空间。
Segmentation fault(Core Dump)
出现错误的原因:
- 内存访问越界:
- 数组访问越界,因为下标出超出了范围。
- 搜索字符串的时候,通过字符串的结尾符号来判断结束,但是实际上没有这个结束符.
- 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,超出了字符中定义的可以存储的最大范围。使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
- 多线程程序使用了线程不安全的函数。
- 多线程读写的数据未加锁保护,对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成核心转储
- 非法指针
- 使用NULL指针
- 随意使用指针类型强制转换,因为在这种强制转换其实是很不安全的,因为在你不确认这个类型就应该是你转化的类型的时候,这样很容易出错,因为就会按照你强制转换的类型进行访问,这样就有可能访问到不应该访问的内存。
- 堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
常见错误展示
graph->Matrix = (int**)malloc(nodeNum * sizeof(int*));
for (i=1; i<=graph->nodeNum; i++)
graph->Matrix[i] = (int*)calloc(nodeNum, sizeof(int));
即出现数组越界,应该为
graph->Matrix = (int**)malloc(nodeNum * sizeof(int*));
for (i=1; i<graph->nodeNum; i++)
graph->Matrix[i] = (int*)calloc(nodeNum, sizeof(int));
出现此类问题建议大家查看访问数组,或者分配时,是否越界。