按关键词阅读:
引言
对于任何使用 C 语言的人 , 如果问他们 C 语言的最大烦恼是什么 , 其中许多人可能会回答说是指针和内存泄漏 。 这些的确是消耗了开发人员大多数调试时间的事项 。
指针和内存泄漏对某些开发人员来说似乎令人畏惧 , 但是一旦您了解了指针及其关联内存操作的基础 , 它们就是您在 C 语言中拥有的最强大工具 。
本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密 。 本文内容包括:
1. 导致内存破坏的指针操作类型
2. 在使用动态内存分配时必须考虑的检查点
3. 导致内存泄漏的场景
如果您预先知道什么地方可能出错 , 那么您就能够小心避免陷阱 , 并消除大多数与指针和内存相关的问题 。
本文图片
啥是内存泄漏
内存泄露的解释如下:
在计算机科学中 , 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存 。 内存泄漏并非指内存在物理上的消失 , 而是应用程序分配某段内存后 , 由于设计错误 , 导致在释放该段内存之前就失去了对该段内存的控制 , 从而造成了内存的浪费 。
在C++中出现内存泄露的主要原因就是程序猿在申请了内存后(malloc(), new) , 没有及时释放没用的内存空间 , 甚至消灭了指针导致该区域内存空间根本无法释放 。
知道了出现内存泄露的原因就能知道如何应对内存泄露 , 即:不用了的内存空间记得释放 , 不释放留着过年哇!
内存泄漏可能会导致严重的后果:
●程序运行后 , 随着时间占用了更多的内存 , 最后无内存可用而崩溃;
●程序消耗了大量的内存 , 导致其他程序无法正常使用;
●程序消耗了大量内存 , 导致消费者选用了别人的程序而不是你的;
●经常做出内存泄露bug的程序猿被公司开出而贫困潦倒 。
如何知道自己的程序存在内存泄露?
根据内存泄露的原因及其恶劣的后果 , 我们可以通过其主要表现来发现程序是否存在内存泄漏:程序长时间运行后内存占用率一直不断的缓慢的上升 , 而实际上在你的逻辑中并没有这么多的内存需求 。
如何定位到泄露点呢?
根据原理 , 我们可以先review自己的代码 , 利用"查找"功能 , 查询new与delete , 看看内存的申请与释放是不是成对释放的 , 这使你迅速发现一些逻辑较为简单的内存泄露情况 。
如果依旧发生内存泄露 , 可以通过记录申请与释放的对象数目是否一致来判断 。 在类中追加一个静态变量 static int count;在构造函数中执行count++;在析构函数中执行count--; , 通过在程序结束前将所有类析构 , 之后输出静态变量 , 看count的值是否为0 , 如果为0,则问题并非出现在该处 , 如果不为0 , 则是该类型对象没有完全释放 。
检查类中申请的空间是否完全释放 , 尤其是存在继承父类的情况 , 看看子类中是否调用了父类的析构函数 , 有可能会因为子类析构时没有是否父类中申请的内存空间 。
对于函数中申请的临时空间 , 认真检查 , 是否存在提前跳出函数的地方没有释放内存 。
本文图片
什么地方可能出错?
有几种问题场景可能会出现 , 从而可能在完成生成后导致问题 。 在处理指针时 , 您可以使用本文中的信息来避免许多问题 。
未初始化的内存
在本例中 , p 已被分配了 10 个字节 。 这 10 个字节可能包含垃圾数据 , 如图所示 。
char *p = malloc ( 10 );
垃圾数据
如果在对这个 p 赋值前 , 某个代码段尝试访问它 , 则可能会获得垃圾值 , 您的程序可能具有不可预测的行为 。 p 可能具有您的程序从未曾预料到的值 。
稿源:(程序猿虎牙参上)
【】网址:http://www.shadafang.com/c/hn102YU2H2020.html
标题:内存|解密C语言中的指针和内存泄漏,这些陷阱一定要避开!