内存操作经典问题分析

  • 杜绝野指针
  1. 指针变量中的值是非法的内存地址,进而形成野指针
  2. 野指针不是NULL指针,是指向不可用内存地址的指针
  3. NULL指针并无危害,很好判断,也很好调试
  4. C语言中更无法判断一个指针保存的地址是否合法
  • 野指针的由来
  1. 局部指针变量 没有初始化(定义指针需要初始化NULL)
  2. 指针所指向的变量在指针之前被销毁
  3. 使用已经释放过的指针(free)
  4. 进行了错误的强制类型转换
  • 基本原则
  1.  绝不 返回局部变量和局部数组的地址(因为函数在运行完后将会释放栈)
  2. 任何变量在定义后必须初始化为0
  3. 字符数组必须确认0结束符后才能成为字符串
  4. 任何使用与内存操作相关的函数必须指定长度信息
  • 常见内存错误
  1. 结构体成员指针未初始化:
  2. 结构体成员指针未分配足够的内存
  3. 内存分配成功,但未初始化
  4. 内存操作越界
  • 内存操作的交通规则
  1. 动态内存申请后, 应该立刻检查指针,值是否为NULL,防止使用NULL指针
  2. free指针之后必须立刻赋值NULL
  3. 任何与内存操作相关的操作都必须 带长度信息
  4. malloc操作和free操作必须 匹配,防止内存泄露和多次释放,在main函数中的malloc应该在main中free,在func函数中的malloc应该在func中free。
void print(int*p,int size)
{
    int i = 0;
    char buf[128] = {0};
    snprintf(buf,sizeof(buf),"%s","Hello World!");
    for(i=0;i<size;i++)
    {
        printf("%d\n",p[i]);
    }
}
 
小结:
  1. 内存错误的本质源于指针保存的地址为非法值
  2. 指针变量未初始化,保存随机数
  3. 指针运算导致内存越界
  4. 内存泄露源于malloc与free不匹配
  5. 当malloc次数多于free时产生内存泄露
  6. 当malloc次数少于free时,程序可能崩溃
 
 
 

猜你喜欢

转载自www.cnblogs.com/chengeputongren/p/12175726.html