前言
欢迎大家来到这片大多数程序员都心有余悸的雷区。本世纪伟大的比尔·盖茨曾经失言:
640K ought to be enough for everybody -- Bill Gates 1981
相信程序员们都经常要编写一些关于内存分配和使用的程序,而且都有过那种生不如死的感觉(当然我是指那种调试程序的感觉了,可能夸张了些!)
常见的内存分配和使用错误
1) 内存的申请和分配并没有成功,但程序员却使用了它。一些新手经常会犯这种错误,他们并不会留意到内存没有分配成功。判断指针的值是否为NULL可以有效地避免这种错误。
2) 内存的分配已经成功,但是却没有进行初始化就直接使用它了。首先是观念上的问题,很多人都没有在使用指针前要初始化这样的习惯,然而这个习惯却是很重要的,希望大家一定要强迫自己养成。第二就是主观地认为自己申请的内存的缺省值为0,这样想是没有什么道理的,内存分配后的值是不确定的。
3) 上面的两种工作都已经做好了(已经成功申请并初始化完成),但是操作时却越界了。
4) 申请了内存,使用完了却忘记了释放,导致内存泄露。这样的错误可以形容为一个恶性的肿瘤,它不会马上要你的命,但是它会慢慢地吞噬你的系统资源,直到你的程序彻底完蛋。
5) 你很小心地释放了内存,但是却又使用了它。由于程序很复杂或者调用顺序出错,这样可能导致出现上面的错误。
一把伟大的双刃剑--指针
我真的非常佩服发明指针的人,他简直太伟大了。能使用如此简洁地方法将复杂的内存结构描述的如此清楚,这本身就是一种伟大的成就。但是,指针之于程序员如同武器之于士兵,用好了可以威力无比,用不好则害人害己。
在计算内存容量的时候有一点是必须要指出的,那就是sizeof计算数组是计算它的实际的内存容量,而计算指针时则永远都是4个字节。C++是永远没有办法直到指针所指的内存容量,除非在申请时记住它。
给你们的忠告
下面提两点,让大家可以防止上面的情况出现:
1) 指针声明后要马上初始化。因为指针出现的缺省值是随机的,所以一定要赋值为NULL,然后再使用。
2) 调用了free和delete后一定要将指针赋值为NULL。原因上面已经提过了,就不再赘述了
总结
本文首先分析了使用内存会出现的常见错误。然后论述了内存使用过程中最为关键的一环 — 指针的一些平时不为人注意的用法和技巧。这些都是我平时在做工程项目中积累下的经验,希望能对大家(特别是那些还在内存的苦海中挣扎的苦难弟兄们)会有所帮助。有什么经验和问题需要交流的,请来C/C++学习乐园来找我。