注册 登录
编程论坛 C++教室

指针问题。输出结果为什么都是一样?

明次 发布于 2009-09-06 14:20, 666 次点击
程序代码:
#include <iostream>
using namespace std;
int main()
{
  int *p1=new int;
  cout<<p1<<endl;
  delete p1;
  long *p2=new long;  //其实这里指向的是int的空间
  cout<<p2<<endl;
  cout<<p1<<endl;
  *p2=3;
  cout<<*p1<<endl;  //输出3
  cout<<*p2<<endl;  //输出3
  delete p2;
}
运行一看,前面3个输出结果一样。后面2两个输出结果也一样,为什么输出结果一样呀?该怎么解决?
2 回复
#2
xlh52252009-09-06 16:06
首先说明,输出结果一样,只是一个偶然的结果!
new 一个int 也就是p1是,他指向内存里的某一个地址.当delete p1后,实际的物理内存已经被释放了.但p1的值仍指刚才new的内存地址,但已经没有任何的意义(实际上,你应该将它设为0),当new p2时,p2是系统在堆上寻找一个符合long大小的空闲空间,然后动态分配给long,此时,p2指向某个内存地址,在你的例子中,p1,p2一样只是偶然!
对*p2赋值后,*p2等于3这是很自然的事情.由于偶然p1,p2指向了相同的内存地址,所以你打印*p1,也就是将本来是long的内容转化为一个int,所以相等的情况也就出现了.
顺便说一下,在delete后,你应该将p1设为0,而已像这种情况,你不应该在来用*p1,这是错误的,很可能会导致程序crash掉!
#3
kqscy12009-09-07 13:49
楼上说的对,但是p1和p2指向的内存地址一样不是偶然,应该是你建立的变量数据存储类型都是auto(自动分配),程序运行后,系统将为程序开辟一块称栈的活动储存区,栈按照“后进先出”的方式使用内存空间。你先是定义了第一个变量,使用了栈中的内存,在你释放后,再定义另外一个同类型变量,依然会使用以前使用的那个内存,因为栈的内存使用方式是固定的。
1