怎么判断一个指针是否为野指针?

kingpin58 2011-04-28 09:48:41
这类似错误真是防不胜防啊
...全文
7557 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
longxing天下 2012-03-08
  • 打赏
  • 举报
回复
我被指针害苦啦,惨。。。。
xiunix 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 bravery36 的回复:]

引用 5 楼 svtanto 的回复:
无法判断,一般的做法是把malloc和free包装以后使用,再加入适当的调试代码。可以参考:编写无错的C程序的秘诀的电子版。比如:free(p)包装一个函数:
void Free(void *p) {
if (p != NULL) {
free(p);
p = NULL;
}
}
至于malloc,一般的做法是分配size个字节的内存时,多……
[/Quote]在函数里面把p设置成NULL, 在函数外面还是不能把的指针设置成NULL, 必须手动设置?
emailtome 2011-05-01
  • 打赏
  • 举报
回复
这个没啥办法! 专门写垃圾回收的东东
android程序员 2011-05-01
  • 打赏
  • 举报
回复
用调试器看此指针的值是否存在,若存在同时又不指向任何值,则为野指针
xryang 2011-05-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anyidan 的回复:]

首先, 定义指针要初始化, 即使 = NULL;

其次,分配后和使用前要检测,使用时不要越界

最后,释放后一定 = NULL;

注意你使用指针的 “副作用”,比如移动指针后,去free()....,
[/Quote]

+1
海盗医生 2011-04-30
  • 打赏
  • 举报
回复
野指针是没法识别的
只能自己编码时时刻注意 初始化和释放两个地方了
bravery36 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 svtanto 的回复:]
无法判断,一般的做法是把malloc和free包装以后使用,再加入适当的调试代码。可以参考:编写无错的C程序的秘诀的电子版。比如:free(p)包装一个函数:
void Free(void *p) {
if (p != NULL) {
free(p);
p = NULL;
}
}
至于malloc,一般的做法是分配size个字节的内存时,多分配一个调试用的结构体,然后把这些结构体做成……
[/Quote]
这个是随手写的代码吧?这种函数也算是野指针的藏身之处了......
lei001 2011-04-30
  • 打赏
  • 举报
回复
不可判断
futurezone 2011-04-30
  • 打赏
  • 举报
回复
T* var=(T*)0x2353464;
futurezone 2011-04-30
  • 打赏
  • 举报
回复 1
T* var=0x2353464;
var就是一个野指针
jernymy 2011-04-30
  • 打赏
  • 举报
回复
所以要养成释放指针后,立刻将该指针指向NULL

// jernymy safe free pointer
#define SAFE_FREE(p) \
if (p) \
{ \
free(p); \
p = NULL; \
}

wizard_tiger 2011-04-30
  • 打赏
  • 举报
回复
只能避免,不能判断。
因为野指针可能指向任何地方。
stonewomen 2011-04-30
  • 打赏
  • 举报
回复
反正lz在释放单元之后最好将指针设为NULL;因为在此delete或者free一个NULL指针是没有错误的额!
firefoxbug 2011-04-30
  • 打赏
  • 举报
回复
free(p);之后,p=NULL就可以防止,如果还不放心,最后加条判断,
screwzm 2011-04-30
  • 打赏
  • 举报
回复
free一个指针之后置NULL
没办法判断的,只能这样预防!!!
flysnowhite 2011-04-30
  • 打赏
  • 举报
回复
保证指针无论何时都指向一个合法的地址。如果不指向任何数据,要赋值为空。
leroncheung 2011-04-30
  • 打赏
  • 举报
回复
野指针的定义:

野指针是指那些你已经释放掉的内存指针。当你调用free(p)时,你真正清楚这个动作背后的内容吗?你会说p指向的内存被释放了。没错,p本身有变化吗?答案是p本身没有变化。它指向的内存仍然是有效的,你继续读写p指向的内存,没有人能拦得住你。
释放掉的内存会被内存管理器重新分配,此时,野指针指向的内存已经被赋予新的意义。对野指针指向内存的访问,无论是有意还是无意的,都为此会付出巨大代价,因为它造成的后果,如同越界访问一样是不可预料的。
释放内存后立即把对应指针置为空值,这是避免野指针常用的方法。这个方法简单有效,只是要注意,当然指针是从函数外层传入的时,在函数内把指针置为空值,对外层的指针没有影响。比如,你在析构函数里把this指针置为空值,没有任何效果,这时应该在函数外层把指针置为空值。




一定要养成好的习惯。
指针尽量在定义出初始化。
使用完成后,赋空。
Ulfsaar 2011-04-29
  • 打赏
  • 举报
回复
有两个函数有类似的功能,你可以试下:
IsBadWritePtr();
IsBadReadPtr();
lr2131 2011-04-29
  • 打赏
  • 举报
回复
如果有现成的函数来检查指针是不是野指针的话,恐怕C语言的高级编程就不会有这么多问题,这个只能靠自己。
辰岡墨竹 2011-04-29
  • 打赏
  • 举报
回复
比如用宏:
#define free_s(ptr) free(ptr); ptr = NULL;
这样的将free都替换掉。
加载更多回复(16)

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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