今天在书上看到这么一段例程,想问下引用不是在被定义时就必须被指定是谁的引用,后续不可更改不可赋值的么?这段程序中先是用delete &ptr1进行了释放内存的操作,请问此操作过后ptr1内是什么情况?悬空了吗?
后续还可以对其进行新的赋值操作ptr1=*new Point(1, 2)这样的操作吗?
请诸位大神帮忙指点~~
C++里的delete &p是执行了什么操作?(p是之前已经定义好的一个引用)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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 保护模式-系统加载-段寄存器