zoukankan      html  css  js  c++  java
  • 再也不怕分配内存了

    最近改用户组管理项目bug时,遇到一个关于内存分配的问题。原来是同事用一个长度为4096的字符数组分配内存,
    strncpy()函数造成拷贝错误,导致用户组管理编辑、添加和删除功能不可用。
    虽然是个小问题,但是内存分配一直都是很重要的,严重时会导致系统崩溃。

    一、内存分配方式

    静态存储区域中分配(系统分配,如全局变量、static变量)
    栈中进行分配(系统分配,如字符数组)
    堆中进行分配(用户动态分配,涉及malloc、calloc、realloc、free函数)

    二、常见错误及解决方案

    1. 使用未分配的内存
      • 使用内存之前检查指针是否为NULL
    2. 赋予初值,即便是赋予零值也不可省略;
      • 使用了分配成功但是未初始化的内存,导致野指针;
    3. 内存分配且初始化了,但是进行了越界操作
      • 注意下表的使用不能超出边界
    4. 忘记释放内存造成内存泄漏;
      • 申请内存的方式和释放内存的方式需要成双成对
    5. free后,未将指针置为NULL,导致也野指针;
      • 使用free内存之后,把指针置为NULL

    1. 项目问题

    项目中的内存分配方式就是栈分配,静态分配,当输入的变量长度超过字符数组最大长度时,内存越界。

    static int deleteRedUsr(int groupID, char *users, long long eventID)
    {
        /* some code */
    
        char usrs[4096] = {0};  //当strlen(users) > 4094则会内存越界
        strncpy(usrs, users, strlen(users)); 
    
        /* some code */
    }
    

    2. 项目解决方案

    不推荐扩大字符数组,而应该使用动态分配内存

    /* 
     * 释放内存,并将指针置为NULL
     * 最好在工具头文件,重复使用
     */
    #define FREE(a)       if( a!= NULL ){ free(a); a=NULL; }
    
    static int deleteRedUsr(int groupID, char *users, long long eventID)
    {
        /* some code */
    
        char *usrs = NULL;
        usrs = (char *)malloc(strlen(users) + 1); //动态分配内存
        strcpy(usrs, users);
    
        /* some code */
    
        FREE(usrs); //在每个return前,释放内存,避免内存泄漏
    
        /* some code */
    }
    
    作者:yusq77

    -------------------------------------------

    Wish you all the best and good health in 2021.

  • 相关阅读:
    docker入门
    初级排序算法1-定义排序规则
    Lambda入门
    mac编辑器vim美化
    SSM搭建
    Memcached安装教程及使用
    lombok
    立个Flag-第一天
    等高线自适应分割
    wpf软件模拟鼠标键盘操作
  • 原文地址:https://www.cnblogs.com/yusq77/p/13546279.html
Copyright © 2011-2022 走看看