避免内存泄漏
让编程改变世界
Change the world by program
避免内存泄漏
这个话题就像古时候女人的裹脚布,又长又臭哈~ 前面我们讲过,分配了一个内存块但忘记了释放它,这是一种严重的错误。这样的内存块将等到程序执行结束时才会被释放掉。 如果程序会运行很长时间(例如在服务器上,注意不是所有的操作系统都想windows一样每天都要重启哈)并且在不停地申请新内存块,忘记释放那些已经不再有用的老内存块将迟早会把内存消耗殆尽,直接导致后边的new操作无法执行甚至是崩溃! 这样的编程漏洞我们称之为内存泄漏(memory leak),因为它会像水池里的漏洞那样把内存池里的可用内存慢慢地消耗殆尽。 new语句所返回的地址是访问这个内存块的唯一线索,同时也是delete语句用来把这个内存块归还给内存池的唯一线索。我们一起来看下面这个栗子:
[codesyntax lang="c"]new *x; x = new int[1000]; delete[] x; x = NULL;[/codesyntax] 这意味着如果这个地址值(保存在x里)丢失了,就会发生内存泄漏问题。 地址值会因为很多原因而丢失哦,比如因为一个指针变量被无意中改写,例如: [codesyntax lang="c"]
int *x; x = new int[3000]; x = new int[4000]; delete[] x; x = NULL;[/codesyntax] 大家看出来了吗?这是会导致内存泄漏的情况之一。 会导致内存泄漏的另一种情况是用来保存内存块地址的指针变量作用域问题,例如: [codesyntax lang="c"]
void foo() { My Class *x; x = new MyClass(); }[/codesyntax] 当foo()函数结束时,指针变量x将超出它的作用域,这意味着它将不复存在,它的值当然就会丢失。
有两种方法可以用来堵住这样的漏洞:
第一个方法是在return语句之前的某个地方插入一条delete x语句: [codesyntax lang="c"]void foo() { MyClass *x; x = new MyClass(); delete x; x = NULL; return; }[/codesyntax] 第二个方法是让函数把内存块的地址返回给它的调用者: [codesyntax lang="c"]
MyClass *foo() { MyClass *x; x = new MyClass(); return x; }[/codesyntax]