你释放的堆内存,并不会影响a,因为a只是一个栈上的变量,举个例子,你脑袋中记着你的电脑密码,某天一个小偷把你的电脑释放走了,你脑袋的密码,虽然没用了,但是你还是记得。
为什么还是访问堆内存的内容6,这个取决于编译器的内存管理,很多时候是释放内存之后,编译器并不会把你以前的值清除,只是在某个标志位标记一下,表示某块内存没人用了,并不会主动把以前的值清零,因为这样浪费时间,下次直接覆盖即可,而且为了加快分配速度,在符合特定策略时,甚至都不标记,例如linux的内存管理的fastbin。所以你这么简单的代码,能访问到以前的内容是完全可能的。
不懂追问,懂了采纳。
delete,只是释放了内存的使用声明,并没有”刷新“或者”格式化“内存。
a变成了一个无用的地址值,不再和内存区块有锁定的关联,之后这块内存可以被其它代码所使用。
但你在delete之后直接访问,因为没有”刷新“或者”格式化“内存,内容都是不变的。
也因此,经常可以看到程序在delete之后,还加一条语句:a=NULL;,这样就是为了更安全,方式代码混乱造成的地址误操作。
int *a=new int[5]{6}; 为什么我没见过这种用法,你是想用a[0] = 6 吧;
用两个编译器都通过不了,改成a[0] = 6后,就输不出6了 。
不过地址还是能输出的,因为删除的是堆上的值而不是地址。
野指针问题,虽然new的内存已经释放,但这个内存中的值仍在,如果程序没有改变这个内存的值,则输出的时候还是原来初始化的值