程序猿虎牙参上|这些陷阱一定要避开!,解密C语言中的指针和内存泄漏
引言
对于任何使用C语言的人 , 如果问他们C语言的最大烦恼是什么 , 其中许多人可能会回答说是指针和内存泄漏 。 这些的确是消耗了开发人员大多数调试时间的事项 。
指针和内存泄漏对某些开发人员来说似乎令人畏惧 , 但是一旦您了解了指针及其关联内存操作的基础 , 它们就是您在C语言中拥有的最强大工具 。
本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密 。 本文内容包括:
1.导致内存破坏的指针操作类型
2.在使用动态内存分配时必须考虑的检查点
3.导致内存泄漏的场景
如果您预先知道什么地方可能出错 , 那么您就能够小心避免陷阱 , 并消除大多数与指针和内存相关的问题 。
文章图片
啥是内存泄漏
内存泄露的解释如下:
在计算机科学中 , 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存 。 内存泄漏并非指内存在物理上的消失 , 而是应用程序分配某段内存后 , 由于设计错误 , 导致在释放该段内存之前就失去了对该段内存的控制 , 从而造成了内存的浪费 。
在C++中出现内存泄露的主要原因就是程序猿在申请了内存后(malloc(),new) , 没有及时释放没用的内存空间 , 甚至消灭了指针导致该区域内存空间根本无法释放 。
知道了出现内存泄露的原因就能知道如何应对内存泄露 , 即:不用了的内存空间记得释放 , 不释放留着过年哇!
内存泄漏可能会导致严重的后果:
●程序运行后 , 随着时间占用了更多的内存 , 最后无内存可用而崩溃;
●程序消耗了大量的内存 , 导致其他程序无法正常使用;
●程序消耗了大量内存 , 导致消费者选用了别人的程序而不是你的;
●经常做出内存泄露bug的程序猿被公司开出而贫困潦倒 。
如何知道自己的程序存在内存泄露?
根据内存泄露的原因及其恶劣的后果 , 我们可以通过其主要表现来发现程序是否存在内存泄漏:程序长时间运行后内存占用率一直不断的缓慢的上升 , 而实际上在你的逻辑中并没有这么多的内存需求 。
如何定位到泄露点呢?
根据原理 , 我们可以先review自己的代码 , 利用"查找"功能 , 查询new与delete , 看看内存的申请与释放是不是成对释放的 , 这使你迅速发现一些逻辑较为简单的内存泄露情况 。
如果依旧发生内存泄露 , 可以通过记录申请与释放的对象数目是否一致来判断 。 在类中追加一个静态变量staticintcount;在构造函数中执行count++;在析构函数中执行count--; , 通过在程序结束前将所有类析构 , 之后输出静态变量 , 看count的值是否为0 , 如果为0,则问题并非出现在该处 , 如果不为0 , 则是该类型对象没有完全释放 。
检查类中申请的空间是否完全释放 , 尤其是存在继承父类的情况 , 看看子类中是否调用了父类的析构函数 , 有可能会因为子类析构时没有是否父类中申请的内存空间 。
对于函数中申请的临时空间 , 认真检查 , 是否存在提前跳出函数的地方没有释放内存 。
文章图片
什么地方可能出错?
有几种问题场景可能会出现 , 从而可能在完成生成后导致问题 。 在处理指针时 , 您可以使用本文中的信息来避免许多问题 。
未初始化的内存
在本例中 , p已被分配了10个字节 。 这10个字节可能包含垃圾数据 , 如图所示 。
char*p=malloc(10);
垃圾数据
如果在对这个p赋值前 , 某个代码段尝试访问它 , 则可能会获得垃圾值 , 您的程序可能具有不可预测的行为 。 p可能具有您的程序从未曾预料到的值 。
良好的习惯是始终结合使用memset和malloc分配内存 , 或者使用calloc 。
推荐阅读
- 不单性能一骑绝尘 iQOO 7的这些亮点也值得一提
- 程序员为教师妻子开发应用:将iPhone变成文档摄像头
- 飞书文档微信小程序审核被卡?字节跳动副总裁谢欣:希望腾讯停止无理由封杀
- 多家快递暂停发往河北省快件,顺丰表示先暂停三天,京东小程序已无法下单
- 小姐姐们的心头好,这些手机为啥这么受欢迎
- 字节跳动高管喊话腾讯,称“飞书文档”小程序审核被卡近两月
- Mate 20系列再升级,EMUI 11的这些功能你一定要试试
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 苹果改变立场 称macOS实用程序Amphetamine可继续留在Mac应用商店中
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回