C++程序作为一种计算机语言,具有功能丰富等优点,广泛应用于工业软件研发当中,不仅具有很高的开发价值,而且研究价值也很高。
有利就会有弊,其程序同时具有概念复杂的缺点,对于初学者来说经常出现错误,令其茫然失措,会使学习的信心受到挫伤。因此加深对常见错误的认识与掌握有效的解决方法显得尤为重要,本文就给大家列举几个C++常见错误及解决方法。
1、返回值返回错误
在项目的生命周期内,错误随时随地都有可能发生,虽然那些错误都在实际运行过程中发生,在设计、编码和测试阶段无法规避但却是可以预见的,这时候我们就可以通过返回值返回错误信息。
请看代码:
以上代码中,打开文件失败是一种常见的可预见性错误,当打开一个文件时,如果打开失败,则后续的操作将无法执行,并会导致程序崩溃。此时可以通过返回错误码的形式通知主调函数发生了错误。
2、变量未声明
由于 C++ 是静态类型编译语言,这类型错误一般都在编译阶段就会发现,不会带入到运行时阶段,但是这种类型的错误客观存在,并且会增大我们的排错时间。
出现这种类型的错误一般源自两种情况,一种是从动态语言转为使用 C++ ,由于习惯问题而直接使用未定义的对象;另一种是由于粗心而写错了变量名字,导致编译器理解为一个新的未声明的变量。
3、内存访问越界
内存越界访问通常发生在数组、字符串或者连续内存的访问。有两种情况:
1.写越界,又叫缓冲区溢出。内存写越界造成的后果是非常严重的。例如访问数组越界可能会修改访问数组的循环变量,造成死循环。
2.读越界,读了不属于自己的内存空间。如果所读的内存地址是无效的,程序会立即崩溃。如果所读内存地址是有效的,读入的时候不会有错误,但是读入的数据是随机的,可能会产生不可控制的后果。
排查内存越界错误的方法包括:
1.使用BoundChecker进行调试,BoundChecker在代码编译时加入了大量的附加处理,其中包括内存堆栈检测等,其实ms的 debug模式也做了许多的类似操作,但debug模式下的一些代码行为,如初始化变量,和Release下的代码执行不同,所以用debug调试不是完美的方式
2.类内部出现莫名其妙的错误时,查看 this 指针是否变化,必要的时候进行手手工检查
3.在调试的 “查看” 窗口 输入:@err,hr 看全局错误变量的内容
4.注释掉部分代码,看是否错误还出现,注释的最佳方式是二分法
5.查看程序异常处的反汇编代码,分析原因
6.最后的办法:代码复查
内存访问越界不属于语法错误,无法通过编译器发现,甚至程序运行初期也不会发生错误,直到某些特定情况下才会由于内存越界而导致程序崩溃,此时程序已经运行一段时间了。内存越界也无法从根本上避免,只能预防。
4、内存泄露
内存泄露是指应用程序未释放动态申请的且不再使用的内存,原因可能是程序员疏忽或者错误造成程序异常。
在C/C++中,内存管理器不会帮助你自动回收不再使用的内存,不管在什么情况下,采取谨慎的态度,杜绝内存泄露的出现,都是上策。尽管一些工具可以帮助我们检查内存泄露问题,但是编程时还是应该仔细一点,尽早排除这类错误,工具只是用作验证的手段。
5、函数跳转处理错误
函数跳转方式主要过程为:先调用函数setjmp,用变量记录当前主函数被执行到的位置,然后在函数中如果调用了longjmp,程序的执行流程将返回到setjmp记录的变量所记录的位置,并使setjmp的返回值为设定的-1。这时,通过判断返回值,就可以知道所需的操作是否正确完成。
请看代码:
以上代码中当打开文件的操作失败时,该工程接下来的操作将无法进行,因此可以通过函数条转的方式实现错误的通知,为后续进一步操作打好基础。
软件编程的过程中,程序员所犯的并不一定是重大错误,反而一些常见的错误屡见不鲜。这些错误严重影响到编程中测试和调试的时间。所以,在编程的过程中,要时时提醒自己,告诫自己避免这些错误。