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

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;
不发生错误因为程序较小,指向的数值单元里的值尚未发生变化,单元也未重新分配另作它用。

养成习惯,编程时要尽量避免这种用法。
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-07-11
分配空间是指从程序可用的堆空间里取出合适大小的空间,并将这个空间的地址付给指针p. 在显示的释放前,这片内存不会被分配给其他指针。

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

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

可能的问题是,某次调用int *p2 = new int时,系统会把这片内存视为可分配的内存而分配给p2,那么 p2与p指向同一片内存, 而产生不可预计的程序逻辑。
第2个回答  2008-07-11
delete后
p = NULL;的操作是很必要的。
delete的p俗称野指针,指向了未知内容。
这段内存可能为其他数据所用。
一般来说,这段内存被其他操作改写的可能性并不大,因此会正确显示。但是是绝对的危险操作。
每年世界上都要花20亿美元解决野指针引起的bug,尤其对长期运行的程序,危害极大。
第3个回答  2008-07-11
delete之后的再new绝对是必须的
你写的程序很小,p的地址空间可能一直未被占用,但当一台电脑有大量程序运行时,不能确定操作系统会分配哪段内存,如果在你delete p之后,p的空间被占用,而你此时在向p进行赋值便会导致程序崩溃

c++中delete之后的再new问题
作为指针型简单变量使用删不删,都可以用,就等于已声明了:int *p;指针本身已有存储单元。new int; 是给它分配存放指向数值的单元。delete 只删了 存放指向数值的单元。指针本身单元还在。只要它的使用符合语法,仍然可用。例如:a = 2;b=3;p = &a; printf("%d\\n",*p);p = &b; printf("...

C++ 中关于new和delete使用的一些疑问
也就是说如果你的程序中常常new一些内存而不delete,你的程序占用的内存会不断增大。但是有一些全局数据,可以new了不delete,在程序开始运行时,创建这些数据,程序运行过程中使用这些数据,直到程序结束。A3.写法错误。 如果new一个数组,必须使用delete[]符号。A4.现代操作系统,程序结束后,会收回这个...

C++中 delete的实质是什么?
delete之后,下次再重新申请的时候可以再申请这块内存地址,也就是将这块地址放到了空闲链表上,对于这块地址的内容,没有进行清空处理(也没有必要);由于你没有将p赋为NULL,所以p指针还是指向这块内存空间。如果不delete的话,你这块内存是不能在申请使用的,也就是所谓的内存泄露。对于delete之后的指针...

c++中delete过后的指针居然还能用 如: int *p=new int(5); delete...
没有问题,依旧能读取东西出来;但是下一次运行,未必能成功。更严重的情况就是导致崩溃。

关于c++ new delete的问题
new是在堆中申请内存并返回该内存首地址,delete是把内存还给进程。。。这两个关键字的用途是使用动态内存。。。你肯定学过静态变量和自动变量,自动变量是有作用域限制的,出了作用域你就不能用了。。静态变量虽然可以通过指针在任何位置使用,但有一个缺陷就是一点声明静态变量这个变量不能删除,永久占...

C++ delete 类对象引用 不能正确运行
new和delete是成对出现的,没有new,就不要delete。new是申请内存空间给一个指针,申请后如果不delete,那部分内存就一直占着,直到重启机器。对于非指针变量,内存自动分配,用完后自动释放,不要你关心的。总之记住,一个new对应一个delete,就好比括号一样,没有对应的左括号,这个右括号不就是错误了...

delete运算符的问题,求c++大神帮忙解决
:in);infile2.getline(s2,50,'\\n');这些语句时,如果输入的字符超过一个,就已经造成越界错误。最后的delete运算仅仅是将你的错误显示出来而已。正确的分配应该是这样,如果你希望有一个 80字节的空间,语句如下:char * p1;p1 = new char[80];再使用p1去保存80个字节以内的数据就不会错了。

c++中不用new也能用delete吗? 什么情况下要用new,什么情况下不要用...
首先,new和delete要成对使用,否则会造成内存泄漏。什么时候使用new,使不使用完全取决于编程人员。new的作用是在堆内存中申请一块内存,并且申请内存的大小可以在程序运行时动态的决定。这个就是堆内存的最大价值之一。因为,于局部变量的栈内存,全局变量和static变量的静态内存都必须在编译阶段确定,在...

老生常谈,delete和delete[]的问题
new和delete对应,new[]和delete[]对应,不能混用.我用的VC6,混用会导致程序崩溃.链表明显是一个结点一个结点生成的,每个结点肯定都是new出来的,所以释放的时候也应该一个一个的delete

C++中delete和new的所需要的时间,哪个高,为什么
一般情况是new高,因为分配内存时要从堆中找出一块合适的大小,又不会太浪费,又不会造成太多碎片,有时还要合并一些内存块,这个过程实际是很复杂的算法完成的 这个工作要么是delete之后做,要么是new之前做,我觉得new之前做比较靠谱,因为delete之后做,其实做到什么地步算好,很多指标是要靠猜的,怎么...

相似回答