c++常见编译问题

double free or corruption (out): 0x00000000011abe70 ***

两种常见情况:

  • 内存重复释放,看程序中是否释放了两次空间

  • 内存越界。数组访问越界,超出范围。
    大部分是第二种情况,正常应该不会重复释放两次空间。

Segmentation fault(Core Dump)

出现错误的原因:

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

你可能感兴趣的:(c/c++)