C++-C中如何避免野指针

C++-C中如何避免野指针

泛泛之交 发布于 2016-11-11 字数 126 浏览 1446 回复 11

C中经常出现野指针,野指针常常给程序带来意想不到的bug,甚至导致程序崩溃,因此想问一下在开发过程中,如何避免野指针的现出?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

泛泛之交 2017-09-21 11 楼

1.直接使用的话,应该注意初始化为null,并且使用完后释放并设为null;
2.使用auto_ptr可以自动释放,从而避免野指针。

浮生未歇 2017-08-08 10 楼

为了避免出现野指针,通常我们需要将指针初始化为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;

归属感 2017-05-14 9 楼

正如大家都知道的,指针其实就是指向内存的某个地址,它告诉编译器应该去哪里寻找,刚定义时值是随机的,不能直接使用,初始化一般赋NULL,有点经验的人应该不会出现这种比较低级的错误;第二种情况是指针的使命完成释放后,它所指向的位置以及没有意义,也不能再使用,应该赋空值;内存的分配与回收应该成对使用,不用的时候赋NULL,指针指向其它地方时,应保证已释放,避免内存泄露;c++等语言提倡使用引用来代替指针,但因为c语言能使用指针才是它屹立不倒的重要原因;可以借鉴智能指针来避免一些错误。

灵芸 2017-05-03 8 楼

首先注意指针的初始化和收尾处理,然后要判断是否申请到有效的指针。使用过程中注意越界问题。

甜柠檬 2017-03-03 7 楼

定义指针的时候初始化,结束使用的时候置为空。只要遵循这样的习惯就能够避免野指针的出现了。另外有一点也是需要注意的是,不要返回局部变量的指针。

清晨说ぺ晚安 2017-02-21 6 楼

野指针主要由下面两种原因导致的。
1)指针变量没有被初始化。指针变量在定义后如果没有初始化是野指针,其值不为NULL;
2)指针 p 被 free 或者 delete 之后,没有置为 NULL;
因此,对症下药,在编程过程上遵循如下原则:
1)凡是定义的指针变量初始化为NULL;
2)指针 p 被 free 或者 delete 之后将其值赋为NULL;

想挽留 2017-02-05 5 楼

未初始化就使用指针在编译时编译器会出警告,因此在编译时消灭所有的警告可能有用。
不好办的是指针指向的内存非法了,除非使用垃圾管理。只有在使用时小心:1)有分配就要有释放;2)字符串操作时使用安全的字符串操作函数,对长度要进行检验。

夜无邪 2016-12-28 4 楼

声明指针时记得要初始化,如:char * p = NULL;
不用的指针要记得释放,如:
if(p != NULL)
{
free(p);
p = NULL;
}

晚风撩人 2016-12-22 3 楼

使用指针前一定要保证它指向了有效的内存空间。 申请内存,或者指向一块已申请了的合法空间
用free释放了内存之后,立即将指针设置为NULL ,防止 产生“野指针” 。 用malloc 申请内存之后,应该立即检查指针值是否为 NULL 。 避免数组或指针的下标越界,特别要当心发生”多1”或者少” 1”的 操作。

泛泛之交 2016-12-19 2 楼

配对的new和delete,以及删除后要赋值为NULL,如果你不是很放心自己写的,建议可以使用autoptr和smartptr

夜无邪 2016-11-24 1 楼

boost shared_ptr, scoped_ptr, scoped_arrad, shared_array, weak_ptr
可以避免野指针