为什么delete了用new分配的指针,这个指针还能用呢,有一段程序,大家帮忙看看,多谢
为什么delete了用new分配的指针,这个指针还能用呢,有一段程序,大家帮忙看看,谢谢!C/C++ code#include ios
为什么delete了用new分配的指针,这个指针还能用呢,有一段程序,大家帮忙看看,谢谢!
C/C++ code#include <iostream>using namespace std;int main(int argc, char const *argv[]){ int *i=new int(8); cout<<*i<<endl; delete i; cout<<*i<<endl; return 0;}
程序运行结果是输出了两个8.
对于这个结果很不解,我都已经把指针delete了,为什么还能输出8呢,delete的作用到底是什么呢?
[解决办法]delete表示这段内存可被重新分配,但不一定马上被分配了
所以你两次输出一样,但也可能不一样
[解决办法]不会啊,delete i 以后*i 的值就是一个随机值。
LZ什么编译器?
[解决办法][解决办法]在程序比较复杂的时候,这种习惯就会出现野指针
正确的做法是:
delete i;
i=null;
[解决办法]典型的野指针行为,指针i被delete之后,没有置为NULL,让人误以为i是个合法的指针。delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉,以后若这段内存被其它代码段操作的话,容易引起程序崩溃,而非常难以找到问题的根源。所以,一般delete之后,把i置为NULL,这样就非常安全了。
[解决办法]delete之后,指针还是指向原来的内存的,即该指针保存的还是new时返回的内存地址,只是指针指向的内存被释放了,此时的指针被称作悬挂指针,如果被释放的内存空间没有被使用,那么那块内存的数据还有可能是原来的值,所以才会出现你说的情况。但是需要注意的是:这样操作是很危险的,因为那块内存可能已经被程序使用了,存储的是其他的对象,如果你还是通过delete后的指针来操作,就很危险,所以建议在delete之后,将指针的值置为NULL,或是0,表示该悬挂指针不指向任何内存。