Oracle数据库11g内存管理入门指南

第五章 内存管理

内存管理,可以说是编程中的雷区。我很佩服那些能安全度过这片雷区的高手,更敬佩那些勇于挑战,解决内存问题的勇士们。请记住,这不是游戏,马虎不得。

我曾经短暂地使用过C#,一开始很不习惯,因为它没有指针!但后来用起来越来越顺手,也是因为它没有指针!短短几天,我轻松写了一万多行代码,感觉比C/C++简单多了。因为你完全不需要考虑底层内存管理和内存泄漏,更不用担心“野指针”。这一切系统都帮你做好了,直接用就行。

但使用C/C++,这一切都得你自己处理,即使是经验丰富的老手也难免会犯错。我曾经参与一个项目,软件交付给客户很久后,客户发现了一个非常严重的bug。这个bug很少出现,但一旦出现就是致命的,系统直接崩溃!

这个问题最终落到了我手上。由于很难复现,按照客户提供的操作步骤根本无法重现问题。经过大约两周时间,每天与客户进行跨洋视频会议,终于找到了bug的根源——野指针!

所以,对待内存管理,尤其是野指针问题,千万不能掉以轻心,否则后果不堪设想。

5.1 什么是野指针

那么,什么是野指针呢?怎么理解这个“野”字呢?

我们先来看看其他两个关于“野”的词:

  • 野孩子: 没人要、没人管的孩子;行为举止不守规矩、调皮捣蛋的孩子。
  • 野狗: 没有主人的狗,没有链子拴着的狗,喜欢到处咬人。

对付野孩子的最好办法是给他制定一套规矩,好好管教,一旦发现不守规矩就严加管束。对付野狗最好的办法就是用狗链拴住它,不让它到处乱跑。

对付野指针可能比对付野孩子或野狗更难。我们需要将对付野孩子和野狗的方法结合起来,既需要规矩,也需要链子。

之前我们将内存比作尺子,很容易理解。尺子上的0毫米处就是内存的0地址处,也就是NULL地址处。这条拴住“野指针”的链子就是“NULL”。

在定义指针变量的同时将其初始化为NULL,用完指针后也将指针变量的值设置为NULL。也就是说,除了使用时,其他时间都将指针“拴”在0地址处,这样它就老实了。

5.2 栈、堆和静态区

对于程序员来说,一般可以简单地将内存理解为三个部分:静态区、栈和堆。很多书籍没有将堆和栈解释清楚,导致初学者总是分不清楚。实际上,堆栈就是栈,而不是堆。堆的英文是heap;栈的英文是stack,也翻译为堆栈。堆和栈都有自己的特性,这里先不做…

pdf 文件大小:1009.63KB