为啥能使用一个野指针(迷途指针)????

okokpypy 2014-10-11 07:14:32
# include <iostream>
using namespace std;

class A
{
public:
A(){int n=5; p=&n;}//构造完毕n被释放,p指向不可用的空间
int * get(){return p;}
private:
int * p;
};

int main(void)
{
A a;
int * x = a.get();
*x = 12345678;
cout << *x << endl;

return 0;
}

p是不是野指针??
...全文
496 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-10-18
  • 打赏
  • 举报
回复
A(){int n=5; p=&n;}//构造完毕n被释放,p指向不可用的空间 未必是不可用。 p指向了未知空间, 不在掌控之中, 后果危险。
aa5566f4 2014-10-18
  • 打赏
  • 举报
回复
引用 14 楼 zhi_ai_yaya 的回复:
[quote=引用 9 楼 aa5566f4 的回复:] [quote=引用 5 楼 qq_15033289 的回复:] 没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!
請問大神什麼是野指針??[/quote] 指针指向对象引用(也就是一个内存地址)。访问的时候,会根据指针提供的地址,作为对象的首地址,读取 sizeof(对象类型)个字节,这就是这个引用对象的占用内存。 野指针是指分配了内存但是却再也没有办法引用的指针。 int *p; p=NULL; //指针赋空后,就变成空指针,不引用任何对象 int n=*p; //空指针引用(解除引用前没有判断是否为空指针) m=5; int *p=new int ;//p引用一个int p=&m; //p重新指向m,这时候上面 new int 那个内存空间就无法引用或删除了。这个内存的指针就是野指针。 正确的做法应该是:先把指针赋空,再引用其他对象。对指针解除引用(即访问引用对象的数据)前,先判断是否为空指针。 m=5; int *p=new int ;//p引用一个int p=NULL; p=&m; //p重新指向m if(p!=NULL) m=*p; 而直接m=*p; 这是很危险的,你不了解上下文,不确定p有没有引用对象 [/quote] 蟹蟹大神 很詳細
灵魂制造者 2014-10-14
  • 打赏
  • 举报
回复
引用 9 楼 aa5566f4 的回复:
[quote=引用 5 楼 qq_15033289 的回复:] 没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!
請問大神什麼是野指針??[/quote] 就像吃饭以后懒得洗碗一样 说不准哪天你的碗里产生病菌让你down了 这个碗就是野指针
我叫小菜菜 2014-10-14
  • 打赏
  • 举报
回复
严谨点,应该是: 先把delete p 或free(p)释放内存地址,然后p=NULL;指针赋空,再p=&m;引用其他对象。if(p!=NULL) m=*p; 对指针解除引用(即访问引用对象的数据)前,先判断是否为空指针。
我叫小菜菜 2014-10-14
  • 打赏
  • 举报
回复
引用 9 楼 aa5566f4 的回复:
[quote=引用 5 楼 qq_15033289 的回复:] 没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!
請問大神什麼是野指針??[/quote] 指针指向对象引用(也就是一个内存地址)。访问的时候,会根据指针提供的地址,作为对象的首地址,读取 sizeof(对象类型)个字节,这就是这个引用对象的占用内存。 野指针是指分配了内存但是却再也没有办法引用的指针。 int *p; p=NULL; //指针赋空后,就变成空指针,不引用任何对象 int n=*p; //空指针引用(解除引用前没有判断是否为空指针) m=5; int *p=new int ;//p引用一个int p=&m; //p重新指向m,这时候上面 new int 那个内存空间就无法引用或删除了。这个内存的指针就是野指针。 正确的做法应该是:先把指针赋空,再引用其他对象。对指针解除引用(即访问引用对象的数据)前,先判断是否为空指针。 m=5; int *p=new int ;//p引用一个int p=NULL; p=&m; //p重新指向m if(p!=NULL) m=*p; 而直接m=*p; 这是很危险的,你不了解上下文,不确定p有没有引用对象
xiaohuh421 2014-10-14
  • 打赏
  • 举报
回复
垃圾要扔进垃圾箱, 但很多人仍然还是扔在地上, 但扔在地上并不范法
xiaohuh421 2014-10-14
  • 打赏
  • 举报
回复
为什么能使用野指针 首先指针仅是一个保存地址的变量, 而这个指针指向的地址是哪里, 编译的时候编译器是不知道的. 所以编译器不会报错. 然后运行的时候那就是不确定, 如果正好指向一个可以访问的合法内存, 那你去读写都没有问题, 如果不可访问, 那就会出现常见的. xxx内存不能为read 等等错误, 就有点像规定垃圾要扔进垃圾箱, 但很多人仍然还是扔在地上.
fengzhw 2014-10-14
  • 打赏
  • 举报
回复
打个比方说:偷来的东西吧也确实是真的东西,所以也能用几下子,就是难免会被警察扣住把东西随时没收,你就麻烦了。 例如你可以偷一些石头打个地基,然后美滋滋盖自己的楼房,结果某天苦主直接把石头要回去了你还无法阻止,于是楼塌了。
yuan-2013 2014-10-14
  • 打赏
  • 举报
回复
野指针是delete之后,没有置空,以至于指针还是指向原来的位置(此时可能已被其他程序占用),这里好像也没涉及到吧
流年逝水 2014-10-14
  • 打赏
  • 举报
回复
当你把一个指针被delete之后没有赋值为NULL或者创建指针之后没有初始化,这个指针就成了野指针,这样做很危险,很可能导致程序出错。
sctianhu 2014-10-14
  • 打赏
  • 举报
回复
野指针使用的后果应该是 “行为未定义” 吧,不是说不能用,只是说造成什么后果不知道; 貌似,你new一个对象delete后,他是野的了吧,你访问它的函数(不访问成员的)还不会崩溃呢。
sctianhu 2014-10-14
  • 打赏
  • 举报
回复
引用 2 楼 okokpypy 的回复:
当有指针型成员变量p时 是不是只能在构造函数中这样定义:p=new int;用其他任何方法都是错误的?
不一定啊,看需要; 1 . 通常做法应该是在初始化类表中初始化为NULL,构造函数里你可以做new动作赋值; 2. 如果觉得里面做new有崩溃的危险,导致类型没有构建完成,释放内存的时候会没法释放,可以单独建立个init之类的函数,单独来调用; 3. 释放一般放在析构函数里,做释放就行了; 以上问题,如果还要牵扯多线程什么的,问题就复一些;,比如析构函数可能被做两次啥的,崩溃就来了。 简单的就上面所的用法吧。
赵4老师 2014-10-13
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
aa5566f4 2014-10-13
  • 打赏
  • 举报
回复
引用 5 楼 qq_15033289 的回复:
没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!
請問大神什麼是野指針??
wenrenhua08 2014-10-13
  • 打赏
  • 举报
回复
P是野指针,这个就像你申请了一块内存: int * ptr = new int[10]; 然后delete[] ptr; 不进行赋值NULL,ptr也是野指针。但是你下次使用时就有好多问题。体会一下。
Uron 2014-10-13
  • 打赏
  • 举报
回复
这个千万别这么做。
C_Scholar 2014-10-12
  • 打赏
  • 举报
回复
没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!
sand6174 2014-10-11
  • 打赏
  • 举报
回复
不想程序段错误你就别用
铖邑 2014-10-11
  • 打赏
  • 举报
回复
也可以外部传进去,但你要保证它只被释放一次
okokpypy 2014-10-11
  • 打赏
  • 举报
回复
当有指针型成员变量p时 是不是只能在构造函数中这样定义:p=new int;用其他任何方法都是错误的?
加载更多回复(1)

64,649

社区成员

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

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