Elisafree
2020-03-25 16:26
采纳率: 100%
浏览 276

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指向的内存空间)

    已采纳该答案
    打赏 评论
  • 502203305 2020-03-25 16:31

    这个类应该是实现了一个等号运算符的吧。

    打赏 评论
  • Iambinary 2020-03-25 16:39

    delete要加类型,比如:

    int *a = new int[100];
    delete []a
    

    所以

    int p = new int &;
    delete &p;
    

    没毛病

    打赏 评论

相关推荐 更多相似问题