关于c++在函数中创建指针的两个问题

图片说明

  1. delete[] ps,是释放了ps指向的内存,但是并没有擦除原内存中的数据,所以在该内存未被写入其他数据之前,还能输出ps;
  2. cout<<&p,输出的并非指针(动态申请的地址),而是局部变量p的地址,所以不变(输出的栈地址)

第一个问题:
delete确实已经释放了ps所指向的那块内存,但所谓释放并不是清空,而是把那块内存重新回收到系统中,告诉系统这块内存又可以重新分配了。
delete的时候,系统只是将指针指向的堆空间回收,但是没有将指针变量的值赋值为null,也就是说指针还是指向原来的堆空间,但是这个空间已经失效。如果继续访问的话将是一个未定义的行为,可能崩也可能不崩
第二个问题:
简单地说,就是编译器选择这么做,但标准并不规定如此
局部变量是分配在栈上,地址是栈指针的一个偏移量。栈就那么大,不可能循环一万次就给分配一万个地址。反正上次循环和下次循环也不冲突,上次用完了下次接着用。