Elisafree 2020-03-25 16:26 采纳率: 0%
浏览 303
已采纳

C++里的delete &p是执行了什么操作?(p是之前已经定义好的一个引用)

图片说明
今天在书上看到这么一段例程,想问下引用不是在被定义时就必须被指定是谁的引用,后续不可更改不可赋值的么?这段程序中先是用delete &ptr1进行了释放内存的操作,请问此操作过后ptr1内是什么情况?悬空了吗?
后续还可以对其进行新的赋值操作ptr1=*new Point(1, 2)这样的操作吗?
请诸位大神帮忙指点~~

  • 写回答

3条回答 默认 最新

  • qybao 2020-03-25 17:44
    关注

    引用是定义的时候必须赋值,后续是可以更改它的值的,更改它的值就相当于更改被引用的变量的值
    比如
    int a = 5;
    int &b = a;
    b = 6; //修改b的值,a的值也会变
    引用变量也是个变量,也有自己的内存空间,但是&取地址操作被做了特殊处理,&取地址会间接寻址到被引用变量的地址
    比如上例
    printf("%p, %p", &a, &b); //打印地址相同,即引用变量虽然也有自己的内存空间,但&b取地址就取的a的地址

    所以
    Point &ptr1 = *new Point; //相当于以下
    Point *p = new Point; //先new Point返回一个临时指针p
    Point &ptr1 = *p; //再把临时指针p指向的内存的值赋给引用变量,即引用变量引用临时指针指向的内存,根据上面&对ptr1取地址就会取得*p的地址p
    可以打印 printf("%p, %p\n", &ptr1, p); 查看内存地址
    所以delet &ptr1 就是释放&(*p),即释放p,也就是new Point的内存空间,此时ptr1的信息理论上是垃圾(因为内存已被释放,内存信息属于垃圾信息)

    后续ptr1=*new Point(1, 2) 相当于
    Point *p2 = new Point(1,2);
    ptr1 = *p2; //往ptr1引用的临时变量的内存空间赋值,理论上&ptr1的内存已被回收,所以该操作属于危险操作(往已被回收的内存空间写信息)
    可以打印 printf("%p, %p\n", &ptr1, p2); 查看内存地址
    所以理论上后来的delete &ptr1是不对的,并不能释放后来new 出来的内存,即不能释放p2指向的内存(理论上p2指向新的内存空间,而&ptr1是原来p指向的内存空间)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch