一段小代码,是否出现了野指针? 请大家发表一下对野指针理解!(希望能Show出代码)

云风 2009-02-08 08:47:07
加精

void son_fun(int &num, float **p)
{
*p = new float[num];
}

void mo_fun(int &num, float **pm, float *pn)
{
float *m_ptemp;

*pm = new float[num];
son_fun(num, &m_ptemp);

for(int k = 0; k < num; k++)
{
*pm[k] = m_ptemp[k];
}
delete []m_ptemp;
}


请问:我调用mo_fun()的时候,会出现野指针吗?请大家谈一下!(希望能Show出自己代码和对野指针的认识及预防)
(注意:我delete []m_ptemp; 但没有m_ptemp = NULL;因为我认为m_ptemp是一个临时变量,系统会释放它的)
...全文
4291 114 打赏 收藏 转发到动态 举报
写回复
用AI写文章
114 条回复
切换为时间正序
请发表友善的回复…
发表回复
airwolf1216 2012-07-24
  • 打赏
  • 举报
回复
没有野指针 不过你要是传错了外层参数 会崩溃 而且 你的程序中没有判断申请是否成功
blue_wind 2011-11-30
  • 打赏
  • 举报
回复
当然是地址咯
[Quote=引用 9 楼 meetyu 的回复:]
引用楼主 ranxiutao 的帖子:
C/C++ code
void son_fun(int &num, float **p)
{
*p = new float[num];
}

void mo_fun(int &num, float **pm, float *pn)
{
float *m_ptemp;

*pm = new float[num];
son……
[/Quote]
lirunfa 2011-10-17
  • 打赏
  • 举报
回复
~~~~~~

[Quote=引用 86 楼 wa_yi 的回复:]
“野指针”不是NULL指针,是指向“垃圾”内存的指针
[/Quote]
北辰天云 2011-09-22
  • 打赏
  • 举报
回复
学习了
wxl1990721 2011-06-30
  • 打赏
  • 举报
回复
看来关注的人还不少哟。。。。O(∩_∩)O~
neverup_ 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 70 楼 bloodchill 的回复:]

我也觉得不会出现野指针,因为局部变量会出栈时释放,但是会内存泄露


*pm[k] = m_ptemp[k];

关键是这个:*pm[k] 根据优先级 等价与 *(*(pm + k)),即给不受管理的内存空间 *(pm + k) 赋值,这个很危险
[/Quote]
学习了
huer0625 2011-04-10
  • 打赏
  • 举报
回复
lz, 针对代码我说三点:
第一个:不会出现野指针,因为 float *m_ptemp;是这个函数的局部变量,并且你是在函数的末尾释放它。释放内存后是否需要对相应的指针赋值为NULL,这个要看之后会不会被误用。在函数末尾没有这种分享,也就不必要赋值为NULL。因为添加了,就臃肿了。但是另外一种观点,却认为要添加,这样可以养成习惯,避免更多的错误。
第二点:可能存在内存泄露。*pm = new float[num];如果你在函数的外面没有负责释放这块内存,它就漏了。
第三点:*pm[k] = m_ptemp[k];这个语句有问题,[]的优先级高于*,所以前面那句相当于*(pm[k])=m_ptem[k];这个跟你想要结果是不一样的。应该写成(*pm)[k] = m_ptemp[k];
最后补充一点:
你的代码太mass了,重构吧。
附录:操作符的优先级
NAME
C operator - C operator precedence and order of evaluation

DESCRIPTION
This manual page lists C operators and their precedence in evaluation.

Operator Associativity
() [] -> . left to right
! ~ ++ -- + - (type) * & sizeof right to left
* / % left to right
+ - left to right
<< >> left to right
< <= > >= left to right
== != left to right
& left to right
^ left to right
| left to right
&& left to right
|| left to right
?: right to left
= += -= *= /= %= <<= >>= &= ^= |= right to left
, left to right
jikeyuan1 2011-01-27
  • 打赏
  • 举报
回复
水贴好多啊
fendouzhe 2011-01-20
  • 打赏
  • 举报
回复
有点儿长,有点儿迷糊...
tianya1264747292 2010-11-19
  • 打赏
  • 举报
回复
Just a 习惯问题!
liu163169 2010-11-18
  • 打赏
  • 举报
回复
啊,涨了好多经验....快升级了....
yaneng 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 ajtomato 的回复:]

m_ptemp 没问题。数组的大小是放在开辟空间的地方的。

*pm[k] = m_ptemp[k]; 应改为 (*pm)[k] = m_ptemp[k];
[/Quote]
正解,但是这样初始化*pm指向的float值有意义吗??m_ptemp[k]都是随机的
zhqanddcy 2010-10-12
  • 打赏
  • 举报
回复
学习了
狂妄Beyond 2010-09-19
  • 打赏
  • 举报
回复
搞得我糊涂了~~~
小小蔷薇 2010-08-31
  • 打赏
  • 举报
回复
跟我接触的程序一摸一样的风格,奶奶的,头疼死了
不过大家的讨论让我受益匪浅,多谢了,^_^
zhaofaquan 2010-08-15
  • 打赏
  • 举报
回复
up up up up up up!
ToBeOOP 2010-08-08
  • 打赏
  • 举报
回复
*p的内存没有释放,至于m_ptemp,个人觉得不是野指针,毕竟后来分配了内存才被调用的。。。
jichen007007 2010-07-31
  • 打赏
  • 举报
回复
学习.....
markfilan 2010-07-31
  • 打赏
  • 举报
回复
好牛!额,全市指针高手!要好好学习了!
lemonadedrink 2010-07-26
  • 打赏
  • 举报
回复
这个倒像是个野指针的概念问题,不过楼主的编码习惯的确不好
加载更多回复(92)

64,687

社区成员

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

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