zoukankan      html  css  js  c++  java
  • 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指向的是同一块内存,出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。

     欢迎赐教!

  • 相关阅读:
    RabbitMQ安装
    windows下安装Erlang
    利用StopWatch类监控Java代码执行时间并分析性能
    HttpClinet工具类
    Javap与JVM指令
    idea全局护眼色绿豆沙
    删除注册在Eureka的服务(无效,多余)
    Steam之两个list间交集、并集、差集
    微服务与SpringCloud简介
    VS code 豆沙绿护眼主题
  • 原文地址:https://www.cnblogs.com/nobbyoucanyouup/p/4592911.html
Copyright © 2011-2022 走看看