编译器为何让野指针存在呢?

sailing0123 2014-04-03 11:30:49
今天有人问我:

C&C++最大的缺点之一--------野指针问题,

为什么各种编译器都不在delete/free后就把指针变量置空NULL呢?


请教各位大牛们帮忙解释解释,谢谢!
...全文
313 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sailing0123 2014-04-07
  • 打赏
  • 举报
回复
引用 6 楼 supermegaboy 的回复:
还有,对于C/C++而言,这不是缺点,是语言特性
指针是C&C++的语言特性,我也很赞同是为了高效率; 但是很多非C&C++的人就喜欢以此“攻击”指针,或者发明新语言而去掉指针。 俗话说,既是优点也是缺点,那么是缺点也就是另一种优点了!
FrankHB1989 2014-04-04
  • 打赏
  • 举报
回复
多此一举.patch。
sailing0123 2014-04-04
  • 打赏
  • 举报
回复
引用 2 楼 vrace 的回复:
置空并不能解决野指针,因为存在多个指针指向同一片内存可能,delete/free 即使对操作的指针置空,其他指向此内存的指针又不受影响…… 考虑使用智能指针更好。
智能指针只是一种补救措施。 如果就考虑一个指针指向一块内存,这样也能减少不少问题啊,可编译器为什么就不这么做,而且C++编译器那么多 VC, gcc, xlc, 等等,为什么不对delete/free函数优化下呢?
ForestDB 2014-04-04
  • 打赏
  • 举报
回复
不是编译器让野指针存在,是人让野指针存在。
majia2011 2014-04-04
  • 打赏
  • 举报
回复
c语言就是c语言,不可能是c++,更不能是java,呵呵呵
mujiok2003 2014-04-04
  • 打赏
  • 举报
回复
零开销原则: 为了高性能, 不做多余的计算, 局部变量没有自动初始化就是例子,相信程序员总能做正确的实现(尽管实际情况显然不是如此)
lm_whales 2014-04-04
  • 打赏
  • 举报
回复
引用 8 楼 FancyMouse 的回复:
两个场景 1. int* p = new int; --p; delete (p+1); 这种时候你怎么置NULL? 2. int* p = new int; int* q = p; delete p; 就算p成NULL了,q不是一样还是野指针? 我既不同意这是“最大的问题”,更不同意弄个delete free置NULL就以为能解决这个问题的想法。这么想的实在是太天真,根本就没考虑过真的引入这个行为以后后果是怎样。
++ 1)C的值传递决定了,指针不可能置为NULL 2)置为NULL,只是把野指针统一为NULL了,NULL只是可以检测指针有没有初始化,并不能禁止使用NULL指针。 3)指针,类似内置类型,不初始化,就是遗留数据,或者0(静态变量,外部变量)。 4)效率 PS: 指针p 置为NULL(p=NULL); 只对检测是否(p == NULL)的代码,是安全的; 并能保证 * p 一定也是安全的。
IT_Linux 2014-04-04
  • 打赏
  • 举报
回复
C语言有个垃圾回收的库,不过,C语言程序员,估计不会喜欢
cchvsgame 2014-04-04
  • 打赏
  • 举报
回复
这个只能解决部分问题,一旦加了这个功能,更容易忘记释放内存
FancyMouse 2014-04-04
  • 打赏
  • 举报
回复
两个场景 1. int* p = new int; --p; delete (p+1); 这种时候你怎么置NULL? 2. int* p = new int; int* q = p; delete p; 就算p成NULL了,q不是一样还是野指针? 我既不同意这是“最大的问题”,更不同意弄个delete free置NULL就以为能解决这个问题的想法。这么想的实在是太天真,根本就没考虑过真的引入这个行为以后后果是怎样。
xiaoyao18301 2014-04-04
  • 打赏
  • 举报
回复
引用 5 楼 supermegaboy 的回复:
[quote=引用 楼主 sailing0123 的回复:] 今天有人问我: C&C++最大的缺点之一--------野指针问题, 为什么各种编译器都不在delete/free后就把指针变量置空NULL呢? 请教各位大牛们帮忙解释解释,谢谢!
为的是效率[/quote] 正解
menzi11 2014-04-04
  • 打赏
  • 举报
回复
这问题根本不是问题.........
赵4老师 2014-04-04
  • 打赏
  • 举报
回复
今天有人问我: 用门牌号标记不同房屋的最大的缺点--------有些门牌号没有实际对应的房屋,有些房屋没有门牌号,有些门牌号一个号对应多个房屋,有些房屋一个屋对应多个门牌号 为什么各种门牌号系统都不在房屋倒塌或被强拆后就把门牌号注销呢? 请教各位大牛们帮忙解释解释,谢谢!
飞天御剑流 2014-04-03
  • 打赏
  • 举报
回复
还有,对于C/C++而言,这不是缺点,是语言特性
飞天御剑流 2014-04-03
  • 打赏
  • 举报
回复
引用 楼主 sailing0123 的回复:
今天有人问我: C&C++最大的缺点之一--------野指针问题, 为什么各种编译器都不在delete/free后就把指针变量置空NULL呢? 请教各位大牛们帮忙解释解释,谢谢!
为的是效率
火头军 2014-04-03
  • 打赏
  • 举报
回复
如果编译器做垃圾回收机制就是java啦,没有垃圾回收机制编译器并不知道有多少个指针指向了现在释放的内存。
max_min_ 2014-04-03
  • 打赏
  • 举报
回复
因为野指针是人为操作的,指向了一个未知的地址而已!这个编译器是不能帮到你的!
vrace 2014-04-03
  • 打赏
  • 举报
回复
置空并不能解决野指针,因为存在多个指针指向同一片内存可能,delete/free 即使对操作的指针置空,其他指向此内存的指针又不受影响…… 考虑使用智能指针更好。
  • 打赏
  • 举报
回复
就算置空 也解决不了野指针的问题.

64,282

社区成员

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

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