新手学习C/C++编程过程当中常见的那些坑,必定要多多注意!

        C/C++中的指针让程序员有了更多的灵活性,但它同时也是一把双刃剑,若是用的很差,则会让你的程序出现各类各样的问题,有人说,C/C++程序员有一半的工做量是花在处理由指针引发的bug上,可想而知,指针中包含的陷阱是多么可怕。既然如此,咱们在编写代码的时候就应该把好关。c++

        要想在编写代码的时候尽量避免指针带来的问题,就须要知道不恰当的使用指针到底会引起哪些问题, 又该如何去避免它?下面一块儿来总结在使用指针时容易遇到的问题。程序员


 

1.避免内存泄露

        程序在运行的时候须要内存,同时咱们也知道内存是有限的,是计算机特别宝贵的资源,对于使用完的内存,应当及时的归还给操做系统。编程

        在c/c++中,若是是栈上的内存(好比说函数中的局部非静态变量),在使用完以后,操做系统会帮咱们自动回收;可是若是是经过动态分配获得的堆上的内存,须要咱们手动释放。函数

        若是咱们在程序中忘了释放这些动态内存,而程序又是会持续运行的服务进程,会致使内存占用愈来愈高,轻者致残影响系统性能,重者致命致使进程崩溃。性能

        总之一句话,再也不用到的内存没有释放,就叫作内存泄露,内存泄露的问题很严重。好了,让咱们看几个内存泄露的案例。学习

        在C/C++中,经过动态内存分配函数或者new运算符分配的动态内存在使用完以后须要手动释放。不然会形成内存泄露。测试


 

建议:代码编写时注意malloc/free, new/delete成对使用操作系统

        即便在malloc/new后显示调用了free/delete释放内存,可是因为异常可能会致使释放内存的free/delete语句得不到执行,也会发生内存泄露,下面的例子就是这种状况。设计


 

        从运行结果来看,类的析构函数没有被执行,可推知delete语句并无获得执行。指针

        有人会说,这还不简单,直接在catch语句的cout << "Something has gone wrong" << endl;下面以后加个delete t不就好了?

        没错,这只是个几十行代码的测试程序,你可能一下就看出问题了,可是若是你面对的是一个庞大的工程时候,我想你心里必定是好崩溃的。还有更好的办法来解决这种问题,就是智能指针,后面会有专门的文章介绍。

建议:C++代码代码中多注意使用智能指针

二、不要使用野指针

        野指针也叫悬挂指针,是指向“垃圾”内存的指针,使用“野指针”会让程序出现不肯定的行为。

        注意,野指针不是NULL指针, 它比NULL指针更容易犯错,由于它不能经过形如 if (NULL == p)的判断语句来预防,只能咱们本身在写代码时多注意。

        指针p被free或者delete以后,没有置为NULL,让人误觉得p是个合法的指针,事实上free或delete只是把指针所指的内存给释放掉,可是指针的值仍是这块内存的地址,只不过这块内存已经被回收了不能被该进程再使用,下面的例子就是一个典型的使用野指针的案例。


 

建议:free或delete以后将相应的指针设置为NULL

        在建立指针变量p时忘了初始化,p的值是个随机的垃圾值,此时读写该指针都是危险的,程序会产生不肯定的行为


 

建议:定义指针变量的时候尽可能初始化,哪怕初始化为NULL也好

        c/c++中,局部变量是存放在栈中的,它的特色是随函数调用时建立随函数结束时销毁,所以在程序中将局部变量的地址返回后赋值给一个指针,这个指针指向的是一个已经被回收的内存,这也是一种野指针。

        看看下面的例子,本来是想将fun函数中的变量i的地址返回给p,用p访问这个变量,这个打印出*p是32767,并非变量i的值8。像这种bug,一旦在大的项目中出现是很难定位的。

建议:不要在函数中返回局部变量的地址,若是代码的逻辑非要是一个局部变量的地址,那么该局部变量必定要申明为static类型,由于static变量的生存期是整个程序运行期间

三、不要使用NULL指针

        你们都知道,在程序中不能使用NULL指针,可是若是不注意,程序中仍是有可能在你的意料以外就使用到NULL指针,下面看两个比较容易出问题的例子。

        动态内存分配函数分配内存的时,有可能会分配失败,此时返回NULL

        从程序运行结果来看,malloc分配失败返回NULL赋给p,再经过p访问其所指向的0地址内存内容时,出现"Segmentation fault"错误。

建议:在使用内存分配函数分配内存的时候,应该用i f(p==NULL) 或if(p!=NULL)进行防错处理。

        此外,在含有指针参数的函数,也是有可能会误用到NULL指针,当调用该函数时传递的指针是个空指针,若是没有if(p!=NULL) 的判断条件,那么在后面使用指针的时候麻烦就大了,下面的例子就是这种状况。

建议:对于含有指针参数的函数,也应当在函数入口处用if(p==NULL) 或if(p!=NULL)进行防错处理。

看到这里是否是有学习到了不少呢~

若是你很想学会编程,那么小编推荐个人C语言/C++编程学习基地【点击进入】!


 

都是学编程小伙伴们,带你入个门仍是简简单单啦,一块儿学习,一块儿加油~

还有许多学习资料和视频,相信你会喜欢的!

涉及:游戏开发、经常使用软件开发、编程基础知识、课程设计、黑客等等......

相关文章
相关标签/搜索