c++中delete之后的再new问题

来源:百度知道 编辑:UC知道 时间:2024/07/06 21:16:11
int main()
{
int *p=new int;
*p=1;
delete p;
*p=2;
return 0;
}
//上面的delete之后p的类型不变,它所储存的地址依旧存在且依旧能够对*p进行赋值。
//那么教材上为什么还要在5,6句之间插上int *p=new int呢?
//有人说插上那句话是为了给*p重新分配空间。那么既然不加那句就可以赋值进去,说明空间还是存在的何必再重新分配空间给它呢?
//又有人说不重新分配的话会出错,那么到底是什么样的错误呢?
//一句话就是delete之后的再new是否必须?
//顺便提一下,我把p改成指向类的变量后运行也没有发现问题。

作为指针型简单变量使用删不删,都可以用,就等于已声明了:
int *p;
指针本身已有存储单元。

new int; 是给它分配存放指向数值的单元。
delete 只删了 存放指向数值的单元。

指针本身单元还在。只要它的使用符合语法,仍然可用。例如:
a = 2;b=3;
p = &a; printf("%d\n",*p);
p = &b; printf("%d\n",*p);

-----------------------
int *p=new int;
*p=1;
delete p;
*p=2;
不发生错误因为程序较小,指向的数值单元里的值尚未发生变化,单元也未重新分配另作它用。

养成习惯,编程时要尽量避免这种用法。

分配空间是指从程序可用的堆空间里取出合适大小的空间,并将这个空间的地址付给指针p. 在显示的释放前,这片内存不会被分配给其他指针。

delete完成两个动作:1,清空ptr指向的内存(对于类对象指针,就是调用其析构函数)。2,告诉系统这快内存现在没有被引用,可以被分配给其他的申请者。

上面的程序中,delete p后, p指向内存的值被清空,也就是*p是一个未被初始化的整型变量。指针p的值并未被改改变,指针p仍然指向这片内存。因此,*p=2; 仍然可以执行。

可能的问题是,某次调用int *p2 = new int时,系统会把这片内存视为可分配的内存而分配给p2,那么 p2与p指向同一片内存, 而产生不可预计的程序逻辑。

delete后
p = NULL;的操作是很必要的。
delete的p俗称野指针,指向了未知内容。
这段内存可能为其他数据所用。
一般来说,这段内存被其他操作改写的可能性并不大,因此会正确显示。但是是绝对的危险操作。
每年世界上都要花20亿美元解决野指针引起的bug,尤其对长期运行的程序,危害极大。

delete之后的