一段小代码,是否出现了野指针? 请大家发表一下对野指针理解!(希望能Show出代码),该如何解决
一段小代码,是否出现了野指针? 请大家发表一下对野指针理解!(希望能Show出代码)C/C++ codevoidson_fun(int
一段小代码,是否出现了野指针? 请大家发表一下对野指针理解!(希望能Show出代码)
C/C++ codevoid 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++ codevoid 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; }
[解决办法]
[解决办法]
函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。
======================
出现了“野指针”,程序并不一定马上出错,甚至不会出错,这应该算“野指针”的一大特点;而它一旦发作,后果就十分严重了,查找这样的问题也十分困难...
好的编程风格就是为了尽量少查找这种本可以避免的问题~
[解决办法]
不会成为野指针,释放内存后你有并没有再使用他,建议设置成NULL
[解决办法]
5 楼不错,挺全面的。
顶顶吧。
[解决办法]
[解决办法]
(注意:我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
[解决办法]
大家的已经说的很完整了
具体问题要具体分析,如果是局部变量,在结束时确实没有必要赋值,不过为了一种习惯,加上也无妨,毕竟代码最终是会被优化掉的
另外多重指针可以用指针引用替代,这样用起来会更方便些
[解决办法]
学习。。。。
[解决办法]
说的很全面啊!学习了
[解决办法]
[解决办法]
[解决办法]
[解决办法]
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之后没有赋空,其他没什么问题
[解决办法]
这段代码内存泄露,你自己小心。
[解决办法]
墨迹。。。
[解决办法]
顶起来。
[解决办法]
[解决办法]
*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是一个临时变量,系统会释放它的)
[解决办法]
[解决办法]
删节号按时打开活塞后可和撒 似的按时的所得税的
[解决办法]
应该是该野指针指向的内存空间没有分配给其他程序使用,数据自然无误。所以表现为没有错误的假象
[解决办法]
[解决办法]
UP
------解决方案--------------------
[解决办法]
顶·
[解决办法]
[解决办法]
pm没有delete掉啊