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

2024-11-28 22:38:20
推荐回答(4个)
回答1:

作为指针型简单变量使用删不删,都可以用,就等于已声明了:
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;
不发生错误因为程序较小,指向的数值单元里的值尚未发生变化,单元也未重新分配另作它用。

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

回答2:

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

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

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

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

回答3:

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

回答4:

delete之后的再new绝对是必须的
你写的程序很小,p的地址空间可能一直未被占用,但当一台电脑有大量程序运行时,不能确定操作系统会分配哪段内存,如果在你delete p之后,p的空间被占用,而你此时在向p进行赋值便会导致程序崩溃