• c++中的new 和delete


      new是用来动态申请内存空间的C++中的一个关键字。delete是用来删除new所申请空间对象的。

      想深入理解new请看:http://blog.csdn.net/songthin/article/details/1703966

      

      delete p和delete [] p的区别:

        1、int* p = new int(20);

             delete p;

        2、int*p = new int[10]();//数组带初始化

            delete [] p;

      从上面两个小例子,可以看出delete p 用来删除单个元素,而delete [] p用来删除数组元素。注意:当删除数组元素时如果使用delete [] p 编译也会是正确的,但意思就不同了。

    关于delete后的野指针:

        如上1,2所示,当删除指针后,该指针变成悬垂指针(dangling pointer).悬垂指针指向曾经存放对象的内存,但该对象已经不存在了。  悬垂指针往往导致程序错我,而且一般很难检测出来。所以一旦删除了对象就立即将指针设置为0,例如 delete p; p = NULL;

       下面是一个关于悬垂指针的列子:引用原文http://blog.sina.com.cn/s/blog_6405313801013jvg.html  

    #include <iostream>
    using namespace std;
    
    int main()
    
    {
    
    int *p = new int;
    
    *p = 3;
    
    cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<<endl;
    
    delete p;
    
    cout<<"删除空间后,指针p读取的值:"<<*p<<endl;
    
    long *p1 = new long;
    
    *p1 = 100;
    
    cout<<"p1的值:"<<*p1<<endl;
    
    cout<<"p的值:"<<*p<<endl;
    
    cout<<"创建新空间后,指针p中保存的地址:"<<p<<endl;
    
    cout<<"指向新空间的指针p1保存的地址:"<<p1<<endl;
    
    *p = 23;
    
    cout<<"将23赋给p的地址后,指针p读取的值;"<<*p<<endl;
    
    cout<<"将23赋给p的地址后,指针p1读取的值:"<<*p1<<endl;
    
    delete p1;
    
    return 0;
    
    }  
    

      

    运行结果:

     以上代码可以看出,删除后的指针p和新建的指针p1指向的是同一块内存,出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。

     欢迎赐教!

  • 相关阅读:
    动图+源码,演示 Java 中常用数据结构执行过程及原理
    16 个超级实用的 Java 工具类
    图解 Java 垃圾回收机制,写得非常好!
    一些值得收藏的开源框架
    JVM 发生内存溢出的 8 种原因、及解决办法
    VC的function类说明 -- 继续
    引用文章 如何在lambda中引入递归调用
    VC中function函数解析
    folly无锁队列正确性说明
    C++ Programming Language中的Calculator源代码
  • 原文地址:https://www.cnblogs.com/nobbyoucanyouup/p/4592911.html
Copyright © 2020-2023  润新知