首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-02-22 
一段小代码,是否出现了野指针? 请大家发表一下对野指针理解!(希望能Show出代码)C/C++ codevoidson_fun(int

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

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_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是一个临时变量,系统会释放它的)

[解决办法]
帮楼主顶上去,
看楼下高手指点啦、、
[解决办法]
http://baike.baidu.com/view/1291320.htm
[解决办法]
你上面的代码 m_ptemp 不会成为野指针

不过建议 delete 后 赋 NULL
[解决办法]
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];  //不会出现野指针,但这行会出现memory leak   son_fun(num, &m_ptemp);      for(int k = 0; k < num; k++)    {       *pm[k] = m_ptemp[k];    }   delete []m_ptemp;     }
[解决办法]
引用楼主 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_fun(num, &m_ptemp);

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



请问:我调用mo_fun()的时候,会出现野指针吗?请大家谈一下!(希望能Show出…

[解决办法]
函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。

======================
出现了“野指针”,程序并不一定马上出错,甚至不会出错,这应该算“野指针”的一大特点;而它一旦发作,后果就十分严重了,查找这样的问题也十分困难...
好的编程风格就是为了尽量少查找这种本可以避免的问题~
[解决办法]
不会成为野指针,释放内存后你有并没有再使用他,建议设置成NULL
[解决办法]

5 楼不错,挺全面的。

顶顶吧。
[解决办法]
引用楼主 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_fun(num, &m_ptemp); //弱弱的问下..&m_ptemp是一个引用还是一个地址??

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

[解决办法]
(注意:我delete []m_ptemp; 但没有m_ptemp = NULL;因为我认为m_ptemp是一个临时变量,系统会释放它的)

可能你还没有搞清楚指针本身和指针指向的东西.

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

int&应该改成int

在这里的上下文下用int是最佳的.

如果不是基本类型一般用const T&
或者类型自身提供的const reference

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

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


float *m_ptemp;
son_fun(num, &m_ptemp); // m_ptemp都没有初始化就使用, 错

*pm = new float[num];

for (int k = 0; k < num; k++) {
*pm[k] = m_ptemp[k]; // 即使上面给m_ptemp分配内存成功了, 但是都是他的元素都随机值.
}

delete[] m_ptemp;
// 如果m_ptemp分配成功, 那么在此m_temp不会造成内存泄漏.
// pm是否会造成内存泄漏, 要看你外面是怎么做的, 但是不推荐这样做.
// 内存分配推荐谁分配, 谁管理, 即由谁来删除.
}


[解决办法]
有多少个new就要有多少个delete,有多少个new []就要有多少个delete[].
[解决办法]
mark
[解决办法]
up up
[解决办法]
看5楼吧,不用再说了
[解决办法]
如果没有设置m_ptemp = NULL,m_ptemp就是野指针!不过后面函数直接返回,这个对象也就注销了,所以不存在什么危险性
[解决办法]
还是养成习惯好

万一以后你在后面加入其他代码却又忘记加上m_ptemp = NULL,那么m_ptemp就是野指针了。
[解决办法]
没有野指针,有内存泄漏.
位置看4楼.
[解决办法]
对!指针被free或delete后将它设为NULL!
[解决办法]
没野指针,但是有泄露。对NEW的地方你一定要考虑怎么DELETE产生的指针。如果不方便可以考虑在参数中传递指针,在使用地NEW和DELETE
[解决办法]
大家的已经说的很完整了
具体问题要具体分析,如果是局部变量,在结束时确实没有必要赋值,不过为了一种习惯,加上也无妨,毕竟代码最终是会被优化掉的
另外多重指针可以用指针引用替代,这样用起来会更方便些
[解决办法]
学习。。。。
[解决办法]
说的很全面啊!学习了
[解决办法]

探讨
引用楼主 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_fun(num, &m_ptemp); //弱弱的问下..&m_ptemp是一个引用还是一个地址??

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

[解决办法]
探讨
C/C++ codevoidson_fun(int&num,float**p)
{*p=newfloat[num];
}voidmo_fun(int&num,float**pm,float*pn)
{float*m_ptemp;*pm=newfloat[num];//不会出现野指针,但这行会出现memory leakson_fun(num,&m_ptemp);for(intk=0; k<num; k++)
{*pm[k]=m_ptemp[k];
}
delete []m_ptemp;
}

[解决办法]
探讨
(注意:我delete []m_ptemp; 但没有m_ptemp = NULL;因为我认为m_ptemp是一个临时变量,系统会释放它的)

可能你还没有搞清楚指针本身和指针指向的东西.

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

int&应该改成int

在这里的上下文下用int是最佳的.

如果不是基本类型一般用const T&
或者类型自身提供的const reference

[解决办法]
up
[解决办法]
学习
[解决办法]
void son_fun(int &num, float **p) 
改成
void son_fun(int num, float** p)



void son_fun(const int num, float** p)

传简单类型的引用效率不会高,反而会低
[解决办法]
mark
[解决办法]
一踏糊涂的代码。
[解决办法]

探讨
一踏糊涂的代码。

[解决办法]
m_ptemp 没问题。数组的大小是放在开辟空间的地方的。

*pm[k] = m_ptemp[k]; 应改为 (*pm)[k] = m_ptemp[k];
[解决办法]
mark
[解决办法]
这段代码的问题明显是内存泄漏,还有delete之后没有赋空,其他没什么问题
[解决办法]
这段代码内存泄露,你自己小心。
[解决办法]
墨迹。。。
[解决办法]
顶起来。
[解决办法]
探讨
up up

[解决办法]
*p = new float[num];
这句之前应该判断*P 是否为NULL,做出合适的处理,例如释放或异常等,应为要在这儿分配内存,并不确定P是否已经有值,如果查找它被调用的地方比较麻烦,还是约定下。
在释放后最好是设NULL
[解决办法]
不会出现野指针,但在使用指针后,建议释放内存,

当内存,不在你的控制中时,所谓的野指针也就出现了
[解决办法]
学习了~~
[解决办法]
看5楼的 不用说了
[解决办法]
不过也学学
[解决办法]
没有野指针,有内存泄漏
[解决办法]
有点没看明白 呵呵
[解决办法]
新手,来学习学习
[解决办法]
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;



float tmp = *m_ptemp;//这样是不是就产生野指针了呢?
}



请问:我调用mo_fun()的时候,会出现野指针吗?请大家谈一下!(希望能Show出自己代码和对野指针的认识及预防) 
(注意:我delete []m_ptemp; 但没有m_ptemp = NULL;因为我认为m_ptemp是一个临时变量,系统会释放它的)
[解决办法]
探讨
没有野指针,有内存泄漏.
位置看4楼.

[解决办法]
删节号按时打开活塞后可和撒 似的按时的所得税的
[解决办法]
应该是该野指针指向的内存空间没有分配给其他程序使用,数据自然无误。所以表现为没有错误的假象
[解决办法]
探讨
应该是该野指针指向的内存空间没有分配给其他程序使用,数据自然无误。所以表现为没有错误的假象

[解决办法]
UP
------解决方案--------------------


探讨
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]; //不会出现野指针,但这行会出现memory leak
son_fun(num, &m_ptemp);

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

[解决办法]
顶·
[解决办法]
探讨
你上面的代码 m_ptemp 不会成为野指针

不过建议 delete 后 赋 NULL

[解决办法]
pm没有delete掉啊

热点排行