zoukankan      html  css  js  c++  java
  • 三.野指针和free

    在C语言项目中,经常会遇到需要程序员手动分配内存的地方。这样做能够节省大量的内存空间,也让程序更加灵活。只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合。这个组合使用起来有一个需要注意的地方,不知道你有没有发现。

    野指针是什么?

    根据百度百科的说法,野指针是指 指向一个已删除的对象或未申请访问受限内存区域的指针.

    我这里是这样理解的,野指针就是指向的内存区域不合法,这里的不合法主要包括以下几个方面:

    1. 所指向的内存未申请

    2.所指向的内存被释放

    当你访问一个未申请的内存区域时,系统会判定我们没有权限,无法访问。内存被释放后你再访问,结果完全不可预知,很大几率会出现段错误(segmentation fault),这是提示你访问越界了。

    野指针怎么出现的?

    在代码中以下几种情况会出现野指针:

    1.指针声明后未初始化

    这种情况下编译器一般会给出一个 warning警告,自己要注意避免。

    2.指针指向的空间被free后,没有被重置为NULL,或者指向一个有效的内存区域

    在free后要及时处理被free的指针,例如令其指向NULL。

    野指针该如何避免?

    1.在指针声明时,要养成将其初始化的习惯。如下:

    int *p = NULL;
    

    默认将其初始化为NULL

    2.在free后面,加上重置指针的代码,如下:

    free(p);
    p = NULL;
    

    重置为NULL

    为了便于理解,下面贴上一份代码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[])
    {
    
    	char *p = NULL;  //初始化为NULL
    	p = (char *)malloc(100);
    	if(p==NULL)
    	{
    		return 0;
    	}
    	strcpy(p,"12321323213");  //向内存拷贝值
    	printf("p : %s
    ",p);     //打印值
    
    	if(p!=NULL) 
    	{
    		free(p);
    		p = NULL;  //在释放完后,再将指针的值置为空
    	}
    	
    	//free释放的是指针所指向的内存空间,而不是指针的值。
    	//所以释放后指针还是指向原来的地址
    	if(p1!=NULL)
    	{
    		free(p1);  //如果再次释放,就会出现野指针错误。
    	}
    	getchar();
    	return 0;
    }
    
  • 相关阅读:
    [LeetCode]Word Break
    [LeetCode]singleNumber
    [LeetCode]Palindrome
    新浪博客无法访问
    C++基础之顺序容器
    C++基础之IO类
    [LeetCode]Restore IP Addresses
    [LeetCode]Maximal Rectangle
    [LeetCode]Reverse Linked List II
    ACM 树形数组
  • 原文地址:https://www.cnblogs.com/hanhuo/p/9367146.html
Copyright © 2011-2022 走看看