【C++永不过时的语言】C/C++指针使用常见的坑
发布日期:2021-06-29 14:30:05 浏览次数:2 分类:技术文章

本文共 2006 字,大约阅读时间需要 6 分钟。

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

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

文章目录

1.避免内存泄露

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

在c/c++中,如果是栈上的内存(比如说函数中的局部非静态变量),在使用完之后,操作系统会帮我们自动回收;但是如果是通过动态分配得到的堆上的内存,需要我们手动释放。

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

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

在C/C++中,通过动态内存分配函数(如malloc系统函数)或者new运算符分配的动态内存在使用完之后需要手动释放。否则会造成内存泄露。

在这里插入图片描述

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

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

在这里插入图片描述

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

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

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

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

2.不要使用野指针

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

注意,野指针不是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变量的生存期是整个程序运行期间

3.不要使用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)进行防错处理。

学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/104187460 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【C++永不过时的语言】snprintf()函数返回值的含义
下一篇:【C++永不过时的语言】深入浅出理解C++函数重载

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月28日 03时06分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

2020年开发运维工具清单:选择开发运维工具堆栈吧 2019-04-29
效率提升法则:高效人士不会去做的4件事 2019-04-29
8.PostgreSQL约束 2019-04-29
【技术分享】使用AES加密技术保障数据安全 2019-04-29
【应用实例】布线多?成本高?不可靠?泽耀方案没烦恼! 2019-04-29
数据可视化工具:Matplotlib绘图 2019-04-29
用Python写个超级小恐龙跑酷游戏,上班摸鱼我能玩一天 2019-04-29
闺蜜看我用Python画了一幅樱花图,吵着要我给他介绍程序员小哥哥 2019-04-29
【Python爬虫实战】知乎热榜数据采集,上班工作摸鱼两不误,知乎热门信息一网打尽 2019-04-29
自从我学会了数据挖掘Matplotlib、Numpy、Pandas、Ta-Lib等一系列库,我把领导开除了 2019-04-29
Python抓取哔哩哔哩up主信息:只要爬虫学的好,牢饭吃的早 2019-04-29
有个码龄5年的程序员跟我说:“他连wifi从来不用密码” 2019-04-29
领导让我整理上个季度的销售额,幸好我会Python数据分析,你猜我几点下班 2019-04-29
【Python爬虫实战】为何如此痴迷Python?还不是因为爱看小姐姐图 2019-04-29
2021年6月全国程序员薪资出炉,大佬您上榜了吗? 2019-04-29
零基础自学Python,你也可以实现经济独立! 2019-04-29
ElasticSearch与Mysql对比(ElasticSearch常用方法大全,持续更新) 2019-04-29
数字化转型的主干道上,华为云以“三大关键”成企业智能化推手 2019-04-29
数字化为何不走“捷”“径”? 2019-04-29
和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了 2019-04-29