[重新认识 C++] 内存管理笔记 3 - 野指针

yufei       2 年, 4 月 前       393

野指针 不是 NULL 指针,而是指向 垃圾 内存的指针。

如果一个指针是 NULL, 我们一般都能发现,因为 if 语句很容易判断和识别出来。

但野指针则不一样,它的危险在于 if 语句对它无效。

野指针的成因有三种,记住它们则能避免 99.99% 的野指针:

  1. 指针变量定义了但未初始化

    指针变量在创建时并不会自动初始化为 NULL 指针。指针变量的缺省值(默认值)是随机的,会乱指一气。

        char *p;    // p 未初始化,可能就是野指针了
    

    因此,指针使用定理之一: 指针变量在定义时同时初始化。 那么自动赋值为 NULL 指针,要么指向其它合法的内存。

  2. 指针被 freedelete 之后,并没有同时设置为 NULL

        char *p = new char[10];   // 指向堆中分配的内存首地址
        cin >> p;
        delete []p;   // p 就变成野指针了
    
  3. 指针操作超越了变量的作用域范围.

        charr *p = new char[10]; // 指向堆中分配的内存首地址
        cin >> p;
        cout << *(p+10)  // 可能输出的数据未知
    

因此,为了避免野指针出现,我的最佳实战是:

  1. 初始化时指向 NULL 然后再赋值

        char *p = NULL;
    
  2. 释放时同时指向 NULL

        delete []p;
        p = NULL;
    
  3. 分配成功后要检查是否分配成功

        char *p=new char[10];
        if(p==NULL)
        return;
    
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.