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


# 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是不是野指针??

21 个解决方案

#1


如果这个地址刚好不在使用,是可以访问的,但是这样写太危险,保不准啥时候就挂了

#2


当有指针型成员变量p时 是不是只能在构造函数中这样定义:p=new int;用其他任何方法都是错误的?

#3


也可以外部传进去,但你要保证它只被释放一次

#4


不想程序段错误你就别用

#5


没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!

#6


其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

#7


这个千万别这么做。

#8


P是野指针,这个就像你申请了一块内存: int * ptr = new int[10]; 然后delete[] ptr; 不进行赋值NULL,ptr也是野指针。但是你下次使用时就有好多问题。体会一下。

#9


引用 5 楼 qq_15033289 的回复:
没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!

請問大神什麼是野指針??

#10


引用 9 楼 aa5566f4 的回复:
Quote: 引用 5 楼 qq_15033289 的回复:

没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!

請問大神什麼是野指針??

就像吃饭以后懒得洗碗一样 说不准哪天你的碗里产生病菌让你down了 这个碗就是野指针

#11


打个比方说:偷来的东西吧也确实是真的东西,所以也能用几下子,就是难免会被警察扣住把东西随时没收,你就麻烦了。
例如你可以偷一些石头打个地基,然后美滋滋盖自己的楼房,结果某天苦主直接把石头要回去了你还无法阻止,于是楼塌了。

#12


为什么能使用野指针
首先指针仅是一个保存地址的变量, 而这个指针指向的地址是哪里, 编译的时候编译器是不知道的. 所以编译器不会报错.
然后运行的时候那就是不确定, 如果正好指向一个可以访问的合法内存, 那你去读写都没有问题, 如果不可访问, 那就会出现常见的.

xxx内存不能为read   等等错误,

就有点像规定垃圾要扔进垃圾箱,  但很多人仍然还是扔在地上.

#13


垃圾要扔进垃圾箱,  但很多人仍然还是扔在地上,  但扔在地上并不范法

#14


引用 9 楼 aa5566f4 的回复:
Quote: 引用 5 楼 qq_15033289 的回复:

没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!

請問大神什麼是野指針??


指针指向对象引用(也就是一个内存地址)。访问的时候,会根据指针提供的地址,作为对象的首地址,读取 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有没有引用对象

#15


严谨点,应该是:
先把delete p 或free(p)释放内存地址,然后p=NULL;指针赋空,再p=&m;引用其他对象。if(p!=NULL) m=*p; 对指针解除引用(即访问引用对象的数据)前,先判断是否为空指针。

#16


引用 2 楼 okokpypy 的回复:
当有指针型成员变量p时 是不是只能在构造函数中这样定义:p=new int;用其他任何方法都是错误的?


不一定啊,看需要;
1 . 通常做法应该是在初始化类表中初始化为NULL,构造函数里你可以做new动作赋值;
2. 如果觉得里面做new有崩溃的危险,导致类型没有构建完成,释放内存的时候会没法释放,可以单独建立个init之类的函数,单独来调用;
3. 释放一般放在析构函数里,做释放就行了;

以上问题,如果还要牵扯多线程什么的,问题就复一些;,比如析构函数可能被做两次啥的,崩溃就来了。
简单的就上面所的用法吧。

#17


野指针使用的后果应该是 “行为未定义” 吧,不是说不能用,只是说造成什么后果不知道;

貌似,你new一个对象delete后,他是野的了吧,你访问它的函数(不访问成员的)还不会崩溃呢。

#18


当你把一个指针被delete之后没有赋值为NULL或者创建指针之后没有初始化,这个指针就成了野指针,这样做很危险,很可能导致程序出错。

#19


野指针是delete之后,没有置空,以至于指针还是指向原来的位置(此时可能已被其他程序占用),这里好像也没涉及到吧

#20


引用 14 楼 zhi_ai_yaya 的回复:
Quote: 引用 9 楼 aa5566f4 的回复:

Quote: 引用 5 楼 qq_15033289 的回复:

没人说不能用野指针呀!只是野指针存在的问题太多。随时,可以发生你想不到的错误!

請問大神什麼是野指針??


指针指向对象引用(也就是一个内存地址)。访问的时候,会根据指针提供的地址,作为对象的首地址,读取 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有没有引用对象



蟹蟹大神 很詳細

#21


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

未必是不可用。 p指向了未知空间, 不在掌控之中, 后果危险。 
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告