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;
    }

    结果如下:

  • 相关阅读:
    friend ---- public and private
    c++中const使用详解
    In c++ access control works on per-class basis not on per-object basis.
    realloc 用法
    enum don't allocate any memory
    (转)C++ STL中的vector的内存分配与释放
    计算机网络面试总结
    Redis安装与测试
    Hbase的安装与测试
    使用ActiveMQ实现简易聊天功能
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3337183.html
Copyright © 2011-2022 走看看