C++-C中如何避免野指针
C中经常出现野指针,野指针常常给程序带来意想不到的bug,甚至导致程序崩溃,因此想问一下在开发过程中,如何避免野指针的现出?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
C中经常出现野指针,野指针常常给程序带来意想不到的bug,甚至导致程序崩溃,因此想问一下在开发过程中,如何避免野指针的现出?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(11)
1.直接使用的话,应该注意初始化为null,并且使用完后释放并设为null;
2.使用auto_ptr可以自动释放,从而避免野指针。
为了避免出现野指针,通常我们需要将指针初始化为NULL,用完后也为其赋值为NULL。
结构体成员指针往往会被忽视,注意它也需要初始化,且需要为结构体指针分配足够的内存,真是就用到了malloc这个宏,使用方法如下:
给指针变量赋初值:
方法一:char * p = (char * )malloc(sizeof(char));
方法二:char * p = NULL;
给数组赋初值:
方法一: int a[10] = {0};
方法二: memset(a, 0, sizeof(a));
memset函数有3个参数:第一个是要被设置的内存起始地址;第二个是要被设置的值;第三个是要被设置的内存大小,单位为字节;
给结构体指针赋初值:
方法一: pstu = (struct student *)malloc(sizeof(struct student));
常见错误: pstu = (struct student *)malloc(sizeof(struct student *));
为了避免出现野指针,在程序的debug版本里可以如下处理:
在函数的入口处使用assert(NULL != p)对参数进行校验。或者用if(NULL != p)来校验。它会提醒有没有初始化指针,起到定位错误的功能。
assert是个宏,它后面括号里的条件若不满足,则程序终止运行并提示出错。
使用完指针后务必记得释放指针所指向的内存,否则不知道什么时候又改变了指针的值,使其变成了野指针!
这里就需要free(p)这个函数的帮忙了,它可以切断指针与指向内存的联系。但是需要注意的是free对于同一指针变量只能使用一次。不然会导致出错或者内存泄漏。
释放完内存后另指针的值变为NULL!
如下:
free(p);
p = NULL;
正如大家都知道的,指针其实就是指向内存的某个地址,它告诉编译器应该去哪里寻找,刚定义时值是随机的,不能直接使用,初始化一般赋NULL,有点经验的人应该不会出现这种比较低级的错误;第二种情况是指针的使命完成释放后,它所指向的位置以及没有意义,也不能再使用,应该赋空值;内存的分配与回收应该成对使用,不用的时候赋NULL,指针指向其它地方时,应保证已释放,避免内存泄露;c++等语言提倡使用引用来代替指针,但因为c语言能使用指针才是它屹立不倒的重要原因;可以借鉴智能指针来避免一些错误。
首先注意指针的初始化和收尾处理,然后要判断是否申请到有效的指针。使用过程中注意越界问题。
定义指针的时候初始化,结束使用的时候置为空。只要遵循这样的习惯就能够避免野指针的出现了。另外有一点也是需要注意的是,不要返回局部变量的指针。
野指针主要由下面两种原因导致的。
1)指针变量没有被初始化。指针变量在定义后如果没有初始化是野指针,其值不为NULL;
2)指针 p 被 free 或者 delete 之后,没有置为 NULL;
因此,对症下药,在编程过程上遵循如下原则:
1)凡是定义的指针变量初始化为NULL;
2)指针 p 被 free 或者 delete 之后将其值赋为NULL;
未初始化就使用指针在编译时编译器会出警告,因此在编译时消灭所有的警告可能有用。
不好办的是指针指向的内存非法了,除非使用垃圾管理。只有在使用时小心:1)有分配就要有释放;2)字符串操作时使用安全的字符串操作函数,对长度要进行检验。
声明指针时记得要初始化,如:char * p = NULL;
不用的指针要记得释放,如:
if(p != NULL)
{
free(p);
p = NULL;
}
使用指针前一定要保证它指向了有效的内存空间。 申请内存,或者指向一块已申请了的合法空间
用free释放了内存之后,立即将指针设置为NULL ,防止 产生“野指针” 。 用malloc 申请内存之后,应该立即检查指针值是否为 NULL 。 避免数组或指针的下标越界,特别要当心发生”多1”或者少” 1”的 操作。
配对的new和delete,以及删除后要赋值为NULL,如果你不是很放心自己写的,建议可以使用autoptr和smartptr
boost shared_ptr, scoped_ptr, scoped_arrad, shared_array, weak_ptr
可以避免野指针