《高质量c++编程指南》

下载本书

添加书签

高质量c++编程指南- 第8节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
if(p != NULL) // 没有起到防错作用

   strcpy(p; 〃world〃); // 出错
  }
  示例7…5  p成为野指针
7。6 动态内存会被自动释放吗?
函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7…6是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!

void Func(void)

char *p = (char *) malloc(100); // 动态内存会自动释放吗?
  }
示例7…6 试图让动态内存自动释放

我们发现指针有一些〃似是而非〃的特征:
(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。
  这表明释放内存并不是一件可以草率对待的事。也许有人不服气,一定要找出可以草率行事的理由:
如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。既然如此,在程序临终前,就可以不必释放内存、不必将指针设置为NULL了。终于可以偷懒而不会发生错误了吧?
想得美。如果别人把那段程序取出来用到其它地方怎么办?
7。7 杜绝〃野指针〃
  〃野指针〃不是NULL指针,是指向〃垃圾〃内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是〃野指针〃是很危险的,if语句对它不起作用。
  〃野指针〃的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7。5节。

(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A 
  {
  public:
   void Func(void){ cout Func()时,对象a已经消失,而p是指向a的,所以p就成了〃野指针〃。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。

7。8 有了malloc/free为什么还要new/delete ?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
  对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
  我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例7…8。
  
class Obj

public :
Obj(void){ cout 
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架