前言
C 语言程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果,最难受的极大多数时候内存问题看不见,也摸不着。编译正确运行出错,让新手从入门到入土,让老手也头痛不已,花费很多时间进行查找和修复。很多时候最严重的安全问题都是由简单的内存错误造成的,导致软件崩溃,系统崩溃。与内存相关的编程是如此重要,而在实践中正确应用又是如此困难,以致于它支配着面向对象编程语言、功能性编程语言、高级编程语言、声明性编程语言和另外一些编程语言的所有其他变量或理论。因此,出于所有这些原因,需要特别关注 C 的内存问题。让我们看一看如何解决这些问题,先不谈是哪种语言。
小编将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。
内存错误分类
所有可能存在的实际问题:
内存泄漏:在分配资源时会发生内存泄漏,但是它从不回收。
您看到问题了吗?除非 Fucntion2()对 free()释放的内存具有不寻常的响应能力,否则每次对Fucntion1的调用都会泄漏 100 字节。在记忆棒增量分发数兆字节内存时,一次泄漏是微不足道的,但是连续操作数小时后,即使如此小的泄漏也会削弱应用程序。
fopen的语义需要补充性的 fclose。在没有 fclose()的情况下,C 标准不能指定发生的情况时,很可能是内存泄漏。其他资源(如信号量、网络句柄、数据库连接等)同样值得考虑。尤其对于C语言文件操作来说,没有关闭掉文件,很容易造成文件读写失败。
内存错误分配:指针的初始化
这些错误通常也不太严重,稍微对指针概念比较掌握应该是没什么问题的。
悬空指针:野指针(没有指向的指针)
数组边界违规
数组边界违规十分危险,它是内存错误管理的最后一个主要类别。如果一个数组大小事100,超过100,则会发生什么情况?回答:难以预料,但是它可能与良好情形相差甚远。特别是,C 复制一个字符串,该字符串不适于为它分配的 100 个字符。在任何常规实现中,“超过的”字符会覆盖内存中的其他数据。内存中数据分配的布局非常复杂并且难以再现,所以任何症状都不可能追溯到源代码级别的具体错误。这些错误通常会导致数百万美元的损失。