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条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器