zoukankan      html  css  js  c++  java
  • C++ 野指针

    看下面一段代码:

    if(条件)

         int *p=new int[8];

    }

    p是代码块中声明的局部指针变量,在代码块执行完退出时,p自动消亡,但p指向的大小为8,类型为整形的内存空间并不会被释放掉。

    代码块退出后,程序无法再通过指针p释放所申请的动态内存,这块内存已经“泄漏”!

    防止内存泄漏的方法:适时释放申请的动态内存  malloc()与free()配对使用,new与delete配对使用

    再看

        int *p=new int[8];

             .........

       delete[] p;

    执行完 delete[] p后,指针p也不会消亡,其值也不会变,并不会变为null,因此,指针被free或delete后,一定要置为null,没有置为null的指针称为“野指针”。

    看下面的一段程序:

    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    char *GetStr()
    {
        char sz[]="Hello World";  
        return sz;
    }
    
    int main()
    {
        char *p=GetStr();//返回字符数组的首地址给p
        cout<<p<<endl;
        system("pause");
        r

    编译通过,但输出的结果不是“Hello World”,而是乱码
    原因在于:字符数组sz是在函数GetStr()的内部创建的,函数执行完,其对应的内存区域会被撤销,main函数中p的初始化就变得没有意义,实际上p并没有指向合法的内存空间,造成输出错误。

       即当前代码块执行完毕后,代码块中的临时变量(包括函数调用时的参数)都自动消亡,其占用的内存空间也被内存管理器收回。此时,指向这些临时变量的指针就变得没有意义。

    再看下面一段程序:

    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    char *GetStr()
    {
        char sz[]="Hello World";  
        return sz;
    }
    
    int main()
    {
        char *p=GetStr();//返回字符数组的首地址给p
        cout<<p<<endl;
    
        char szz[]="Welcome C++";
        char *q;
        q=szz;
        cout<<q<<endl;
    
        system("pause");
        return 0;
    }

    结果如下:

  • 相关阅读:
    OpenStack(M版)之基础环境配置(2 更换源、安装OpenStack客户端)
    OpenStack(M版)之基础环境配置(1静态ip、网络接口)
    Java关于print、println、printf的区别
    输出1-n的全排列dfs
    统计难题
    单词数
    减肥计划
    Zero Array---思维题
    快速幂+快速乘
    线段树求逆序对
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3337183.html
Copyright © 2011-2022 走看看