语法错误比较容易识别,下面主要介绍一些非语法的错误。
1、内存泄漏
内存泄漏指分配的内存在用完后没有收回,导致一段时间后内存减少,系统变慢。例如,malloc、new等动态申请内存的操作。当申请了一块内存然后在释放前又一次申请时,那么原来那块内存将丢失不能被收回。
2、逻辑错误
当语法正确,但是却没有达到预期的目的时,就发生了逻辑错误。这多是算法设计有缺陷或代码输入错误造成的。这种错误无法由编译器和调试器发现,因为程序没有问题,并如实按照要求去执行了。
3、内存越界
当指针或数组使用了不属于自己的内存时,就会引发该错误。当这种错误仅导致访问了不该访问的数据时,未必会引起程序中断。但是当访问到系统区域时,则多数情况下会导致程序崩溃。
4、无限循环
对于循环类语句,如for、while等,如果循环终止条件设置不恰当,就会导致程序无限循环下去。与第2种错误一样,程序也没有问题,但是执行时却不会停止。
5、指针错误
指针导致的错误主要有3类:没有初始化,却使用;已删除,但仍然使用;指针无效。前两类都可以通过观察源代码来排查,第3类则必须通过分析来找出原因。例如,强行将字符型指针转换为整型指针,系统只是对内存块的边界做了重新界定,但是对于数据没有任何操作。由于内存块扩大了,转换后指针的数据将是没有任何意义且未知的。
6、编码错误
这主要指声明与定义不一致,或者使用与定义不一致。例如,声明某个函数接收3个参数,但是定义时却只有2个,或者使用时只给出了2个等。
——摘自《C++从入门到精通》 秦广军等编著