这样会造成野指针么?

cuiwencheng 2013-08-12 06:44:37
class obj
{
private:
int a;
public:
obj()
{
a=10;
}
obj(int x):a(x)
{}
};

void temp()
{
obj* p1=new obj();
obj* p2=new obj(1);
obj* p3=new obj[100];

delete p1;
delete p2;
delete []p3;
}

先明确一下野指针的定义:指向不可用内存区域的指针。
请问在这样的情况下,当执行完temp()后,p1,p2,p3会不会成为野指?

按照往常,在delete之后就不管了。但是我在看一本资料说,这样只是delete掉了申请的内存空间,p1,p2
和p3还是指向原来的地址,只是因为delete掉之后他们不可用而已。这样的话,是不是在delete之后还要加上
一段
p1=NULL;
p2=NUll;
p3=NULL;

这样才能避免p1,p2和p3成为野指针?
...全文
258 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saingel 2013-08-14
  • 打赏
  • 举报
回复
如果指针还要用得话赋NULL,否则没必要
SkyHeight 2013-08-14
  • 打赏
  • 举报
回复
delete后将他们都赋值为NULL 即可
zhctj159 2013-08-14
  • 打赏
  • 举报
回复
不会,,函数temp执行完后,这三个指针的空间已经已经从栈里释放了,,也就是生命期结束了
jdwx 2013-08-13
  • 打赏
  • 举报
回复
引用 14 楼 lm_whales 的回复:
如果delete 后面,没有代码 这里的变量,全部都是局部自动变量,指针没有传递到函数外部,不会出现野指针问题。 会出现野指针问题,的情况是,指针可以访问,指针指向的内容,处于不可访问状态,比如以及释放内存,然后访问该内存。

#include<iostream>
using namespace std;

class obj
{
private:
	int a;
public:
	obj(){a=10;};
	obj(int x):a(x)
	{};
       
        //由于 a是私有的,所以定义show,和 seta访问a,
       void show()const {cout<<x<<endl;};
       void seta(int x){a=x;}; 
};

void temp()
{
	obj* p1=new obj();
	obj* p2=new obj(1);
	obj* p3=new obj[100];

	delete p1;
        //p1->show();//这里p1就是野指针了,不过基本没有问题,
                        //因为没有重新分配内存,而且只是读操作
         p1->seta(200); //p1就是野指针,这种写操作问题比较大。
         
	delete p2;
	delete []p3;
        obj* a=new (300);
        // p1->seta(200); 
        //这种地方,野指针问题就比较严重了,因为不知道,
         // 是否p1已经分配给a了,或者如果用于管理内存,
         //那就会造成,内存分配机制出错,错误更严重。
        delete a; 
}
不过,没初始化的指针,已经释放的指针,置为NULL,确实是个好主意,好习惯!
不过,没初始化的指针,已经释放的指针,置为NULL,确实是个好主意,好习惯!+1000
lm_whales 2013-08-13
  • 打赏
  • 举报
回复
如果delete 后面,没有代码 这里的变量,全部都是局部自动变量,指针没有传递到函数外部,不会出现野指针问题。 会出现野指针问题,的情况是,指针可以访问,指针指向的内容,处于不可访问状态,比如以及释放内存,然后访问该内存。

#include<iostream>
using namespace std;

class obj
{
private:
	int a;
public:
	obj(){a=10;};
	obj(int x):a(x)
	{};
       
        //由于 a是私有的,所以定义show,和 seta访问a,
       void show()const {cout<<x<<endl;};
       void seta(int x){a=x;}; 
};

void temp()
{
	obj* p1=new obj();
	obj* p2=new obj(1);
	obj* p3=new obj[100];

	delete p1;
        //p1->show();//这里p1就是野指针了,不过基本没有问题,
                        //因为没有重新分配内存,而且只是读操作
         p1->seta(200); //p1就是野指针,这种写操作问题比较大。
         
	delete p2;
	delete []p3;
        obj* a=new (300);
        // p1->seta(200); 
        //这种地方,野指针问题就比较严重了,因为不知道,
         // 是否p1已经分配给a了,或者如果用于管理内存,
         //那就会造成,内存分配机制出错,错误更严重。
        delete a; 
}
不过,没初始化的指针,已经释放的指针,置为NULL,确实是个好主意,好习惯!
阿麦 2013-08-12
  • 打赏
  • 举报
回复
我以为: 1、p1, p2, p3 有作用范围仅限于 temp,代码中没有再用到。而用,在temp以外是不可能用到的。所以,这些不会造成野指针 2、养成用完就置为 NULL 是一个很好的习惯,建议按照书上的建议坚持良好的习惯。
ProgramRun 2013-08-12
  • 打赏
  • 举报
回复
小弟认为应该置NULL;因为当你DELETE后我觉得这只是切断的指针与内存的关联,而指针的地址还是存在的。而这已释放的指针可能以后还会用到,当你做IF判断这是否是空指针的时候,往往顺利通过,但这个指针所指的地址往往不是我们想要的,带来的不必要的麻烦,所以还是老老实实的写上吧。。。
max_min_ 2013-08-12
  • 打赏
  • 举报
回复
引用 8 楼 cuiwencheng 的回复:
我的意思是在temp()中继续使用p1,p2和p3的情况下……
赋值 清空的, 如果你后续还要用的话! delete只是 回收分配的堆空间的!系统还是会给它分配栈空间的!所以最好置NULL
mujiok2003 2013-08-12
  • 打赏
  • 举报
回复
Dangling pointers and wild pointers in computer programming are pointers that do not point to a valid object of the appropriate type. These are special cases of memory safety violations.
引用 楼主 cuiwencheng 的回复:
先明确一下野指针的定义:指向不可用内存区域的指针。
大尾巴猫 2013-08-12
  • 打赏
  • 举报
回复
引用 7 楼 cuiwencheng 的回复:
[quote=引用 4 楼 ananluowei 的回复:] 你的程序中delete后函数就返回了,p1,p2,p3本身都不存在了,没机会成为野指针,不用NULL 类似在析构函数中,delete就好了,不用再赋值NULL
其中temp()是我为了方便陈述,我的 意思是在temp()中如果继续使用p1,p2,p3……,那样会不会成为野指针?[/quote] 看你怎么个继续使用了,直接 *p当然是野指针,如果有 p = &i这样继续给地址或者继续new的话,不会成为野指针。 所谓野指针,就是指针delete后,继续对其做解除引用的操作。这个指针称为野指针,它对应的地址空间是无效的。 如果继续给p新地址的话,不是野指针。
cuiwencheng 2013-08-12
  • 打赏
  • 举报
回复
我的意思是在temp()中继续使用p1,p2和p3的情况下……
cuiwencheng 2013-08-12
  • 打赏
  • 举报
回复
引用 4 楼 ananluowei 的回复:
你的程序中delete后函数就返回了,p1,p2,p3本身都不存在了,没机会成为野指针,不用NULL 类似在析构函数中,delete就好了,不用再赋值NULL
其中temp()是我为了方便陈述,我的 意思是在temp()中如果继续使用p1,p2,p3……,那样会不会成为野指针?
starytx 2013-08-12
  • 打赏
  • 举报
回复
当执行完temp()后,p1,p2,p3会不会成为野指? ----------------- 虽然是野指针了,但在函数内部的局部变量,你也无法再访问这几个指针了,所以此处无所谓了
mujiok2003 2013-08-12
  • 打赏
  • 举报
回复
delete之后没有使用它的代码, 可以不用清零。
大尾巴猫 2013-08-12
  • 打赏
  • 举报
回复
你的程序中delete后函数就返回了,p1,p2,p3本身都不存在了,没机会成为野指针,不用NULL 类似在析构函数中,delete就好了,不用再赋值NULL
mujiok2003 2013-08-12
  • 打赏
  • 举报
回复
清0(=NULL)是为了以后方便判断而已: [code=C] if(NULL ! = p1) { //... } [/code] 如果没有判断直接使用,还是野指针(因为NULL区也不属于进程空间)
图灵狗 2013-08-12
  • 打赏
  • 举报
回复
释放完之后需要置为NULL,不然后面有机会误操作这些指针。
引用 楼主 cuiwencheng 的回复:
class obj
{
private:
	int a;
public:
	obj()
	{
		a=10;
	}
	obj(int x):a(x)
	{}
};

void temp()
{
	obj* p1=new obj();
	obj* p2=new obj(1);
	obj* p3=new obj[100];

	delete p1;
	delete p2;
	delete []p3;
}
先明确一下野指针的定义:指向不可用内存区域的指针。 请问在这样的情况下,当执行完temp()后,p1,p2,p3会不会成为野指? 按照往常,在delete之后就不管了。但是我在看一本资料说,这样只是delete掉了申请的内存空间,p1,p2 和p3还是指向原来的地址,只是因为delete掉之后他们不可用而已。这样的话,是不是在delete之后还要加上 一段
p1=NULL;
p2=NUll;
p3=NULL;
这样才能避免p1,p2和p3成为野指针?
max_min_ 2013-08-12
  • 打赏
  • 举报
回复

p1=NULL;
p2=NUll;
p3=NULL;
delete 之后最好也加上这些吧!,不然是成为野指针的!它还是可以用的! 只是地址不明确而已!无法操控的!

64,642

社区成员

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

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