delete删除的对象还可以再用?

来源:百度知道 编辑:UC知道 时间:2024/05/17 03:14:01
我用clock* ptr = new clock进行了一些操作后,我就使用了delete ptr,但是我再次用了cout<<ptr;这个语句,输出了ptr的地址。因为我以前看过一篇文章,说的是delete之后,原来的指针变成了“野指针”,虽然不指向任何东西,但是仍在内存中占用空间。那么这样看来,我delete ptr之后,输出它的地址是可以的了。但是我又调用类的其他成员函数后,比如ptr->print();还是能够正确显示。请问这是为什么呢?这样delete难道没起到作用吗?但是我又写了个程序int *p = new int(5);然后是赋初值,然后又delete[] p,接着尝试for( int i = 0; i<5; i++)
cout<<*(p+i);这样出现了运行错误,说明是delete[] p是起到了作用的。

1、你的指针在delete以后,指针变量自身被销毁了(也即使说指针变量本身不在占据内存空间),但是其所指向的clock内容仍然还在占据内存空间,这时用ptr=NULL使其指向空就ok了。而clock内容是赋在栈上的,在引用范围外会自动销毁。
2、int *p = new int(5);你的5是初始化int还是给int建立数组,从你后面的来看是建立数组,那么就应该是int *p = new int[5];这样就行了

delete ptr之后,ptr成了“野指针”,如果此时不把ptr设置为NULL,会让人误以为p是个合法的指针,原来所指的那块内存还在,它已经没有使用权限,这块内存会等着被其他操作覆盖掉。如果你使用ptr->print()时还能正常,说明此时此刻还没有被覆盖。所以最好在delete ptr之后,同时把ptr设置为NULL,以防止错误使用。