c++中的delete的操作到底是怎么回事??

来源:百度知道 编辑:UC知道 时间:2024/07/02 06:15:08
代码如下:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int *p=new int(5);
cout<<p<<" "<<*p;
cout<<endl;
delete p;
cout<<p<<" "<<*p;
cout<<endl;
return 0;
}
结果是:
00399208 5
00399208 -572662307
1.*p不是一个不确定的值,运行结果总是-572662307。
2.如果在程序代码后面再加上*p=5;cout<<*p<<endl;
可以再输出一个5;注意已经使用了delete操作。
为什么呀???
麻烦了各位大虾。
参考这个问题注意:
问题1中的值是确定的,是一种标记,表示是所指向内存无效的。
问题2中最佳答案中“那时”表示不一定能成功。这个操作本身是一个非法操作。

00399208 代表的是p这个指针指向的地址值,在delete之前输出的那个5代表p这个指针指向的一个int空间里面存放的数值;
在你delete之后,p这个指针没有变化,仍然是00399208,但是它指向的空间已经被释放了,所以输出的就是一个“不确定”的数值:-57266307.

对于问题的补充:
2.如果在程序代码后面再加上*p=5;cout<<*p<<endl;
可以再输出一个5;注意已经使用了delete操作。
空间虽然释放了,但那时p这个指针仍然是有效的,它指向的内存仍然是可写的,所以程序会进行正确的输出。

p是个指针,int *p=new int(5)使p指向新申请的具有5个元素的整型数组这段内存,用delete删除后,这段内存已经被回收,而p没有改变,仍指向这段内存,所以*p是个不确定的值。

1.*p不是一个不确定的值,运行结果总是-572662307。
这是因为p指向的内存是固定的,但这段内存并未被本程序使用,因此可能被操作系统分配给其他程序,若该段内存没有被分配,则内存中的数据是不变的,也就是*p是固定的,另外,不同的编译器也有不同的约定,有的编译器会对不属于本程序的内存固定的显示一个错误值。

2.如果在程序代码后面再加上*p=5;cout<<*p<<endl;

这等于为*p申请了内存,存放整型数据5,*p当然=5.

1.指针p里的地址肯定是固定的.
这是因为程序使用的内存可分成4个部分(代码区,静态全局变量区,栈区,堆区),你这里是动态分配内存,使用的是堆区,堆里面的可用空间不是连续的,系统里面存储了一个链表来放这些可用空间的地址,而你申请内存时,系统会从表头开始检索,遇到第一个满足要求的,就把这个地址给你.
你在运行程序时系统找到那个地址给你,结束运行后你那块内存又被还回去了
(delete p),你第二次在运行这个程序,系统还是那样找,找到的当然还是那个地址.

2.这个结果是对的,但这么做不好, 你最好在delete p;后加一句
p = NU