int *p=new int;*p=5;delete p;指针问题

魔w_j剑 2012-10-27 09:50:28
int *p=new int;
*p=5;
delete p;
请问以上只是把p指针的内容释放了导致p成为了野指针,
还是把p指针以及它所指向的内容也都删除了,以后这个程序中就没有p指针了
...全文
469 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qyxqyxqyx 2012-10-28
  • 打赏
  • 举报
回复
p是栈上的,还在。
堆上的int被系统收回了。
wjjll123 2012-10-28
  • 打赏
  • 举报
回复
就我个人的理解。delete之后,P指针,指向的地址没有变,地址对应的内存里面的值没有变,变的只是P指向的地址不归P管而归系统管了。
dzweather 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

楼主想问什么?
delete p;只是把p指向的那块内存归还给内存管理器而已,不会修改p指向的内容
[/Quote]

#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
int *p=new int;
*p=5;
cout<<p<<" is "<<*p<<endl;
delete p;
cout<<p<<" is "<<*p<<endl;
return 0;
}

显示结果如下:
0x540fd8 is 5
0x540fd8 is 5509208
请按任意键继续. . .

第一:p是主程序中变量,只有退主程序这个作用域,这个变量才会消失。
p的值同其它int变量一样,只有当赋于新值才会变量。释放并不改变其值。
所以释放后它的值还是原值(指针地址值)。
第二:释放,是说是内存堆区分配问题,堆区实行“计划经济”,当程序员主动要求分配时,
就按要求在堆区分配一块内存区域,并“标注”上此地为我占,其它人不得再分配,不得再
来用这块内存,除非“释放”后表明此地是“无主之地”。
一旦释放后,原占用的内存就是“无主之地”,其“内容”就是不定的,也就是俗称“野值”。

因此,释放后,p的指针地址值没发生变化,但所指向的地址的内存中的值是不定的。
魔w_j剑 2012-10-27
  • 打赏
  • 举报
回复
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为
用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7.5节。
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p是“野指针”
}

函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。

Eleven 2012-10-27
  • 打赏
  • 举报
回复
delete 以后,一般将指针置为NULL
gkpeng 2012-10-27
  • 打赏
  • 举报
回复
new之后p指向一块系统分配给它的内存.delete就把这块内存回收,原来的内容自然也就被清除了.但指针还是指向这个地址,只是这块内存是无效的.所以要把p置NULL.
羽飞 2012-10-27
  • 打赏
  • 举报
回复
楼主想问什么?
delete p;只是把p指向的那块内存归还给内存管理器而已,不会修改p指向的内容

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧