你真的会分配内存吗?

Posted yusq77

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的会分配内存吗?相关的知识,希望对你有一定的参考价值。

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

虽然是个小问题,但是内存分配一直都是很重要的,严重时会导致系统崩溃。

内存分配简介

内存分配方式

静态存储区域中分配(系统分配,如全局变量、static变量)

栈中进行分配(系统分配,如字符数组)

堆中进行分配(用户动态分配,涉及malloc、calloc、realloc、free函数)

 

常见内存分配错误及解决方案

使用未分配的内存;    -->  使用内存之前检查指针是否为NULL

使用了分配成功但是未初始化的内存,导致野指针;    --> 赋予初值,即便是赋予零值也不可省略

内存分配且初始化了,但是进行了越界操作;   --> 注意下表的使用不能超出边界 

忘记释放内存造成内存泄漏;    --> 申请内存的方式和释放内存的方式需要成双成对 

free后,未将指针置为NULL,导致也野指针;    --> 使用free内存之后,把指针置为NULL

 

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

技术图片
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 */
}
View Code

 

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

技术图片
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 */
}
View Code

 

以上是关于你真的会分配内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

你真的懂JVM内存结构吗?—深入理解JVM之内存结构

你真的了解UIViewController生命周期吗?

c++中引用面试点7连问以及引用真的不分配内存吗

c++中引用面试点7连问以及引用真的不分配内存吗

你真的理解Java垃圾回收吗?万字长文带你彻底搞懂垃圾回收机制

调用_freea 真的有必要吗?