关于创建数组malloc方法及需要注意free()和memset()的坑和必要性

工作需要使用一个三维数组,存储n个4000*4000像素点的图像进行操作,由于数据有些大、而且不需要查找和删除操作,为了不降低访问速度,所以没有用vector容器,而是选择了malloc创建数组。

short int ***data;//三维数组
data = (short int ***)malloc(NX*sizeof(short int **));//请求最外层空间
for (int i = 0; i < NX; i++)
{
    data[i] = (short int **)malloc(NY*sizeof(short int *));//请求中间层空间
}
for (int i = 0; i < NX; i++)
{
        for (int j = 0; j < NY; j++)
    {
        data[i][j] = (short int *)malloc((BN + 2)*sizeof(short int));//请求最内层空间
        memset(data[i][j], 0, (BN + 2)*sizeof(short int));//最内层的数据初始化
    }

}

注意1:一定要初始化,因为在Debug模式下默认初始化是0,但到了release模式下默认初始化是随机数,会出现在Debug模式下没问题,但到release模式下计算出来的就不对了,养成变量初始化的好习惯!!

            这里用memset初始化,各参数如下 : memset(数据指针,初始化成的数字,数组长度);

注意2:数据用完后一定要用free()手动释放掉,(系统不会自动释放掉),否则在下次循环操作下内存(堆)就不够用了,导致程序花了很大的时间寻找连续物理内存,最终还是找不到合适的,程序就停了很长时间再崩溃!!

            free()三维数据和申请空间的顺序正好相反,从内到外层层释放,如下:

for (int i = 0; i < NX; i++)
{
        for (int j = 0; j < NY; j++)
        {
            free(data[i][j]);//释放最内层
        }
}
for (int i = 0; i < NX; i++)
{
        free(data[i]);//释放中间层
}

free(data);//释放最外层

ps:通过free后可以分批处理很多数据了,不会在因为内存的事卡死,并且通过初始化后计算结果release与debug结果一致,但release消耗时间是debug的三分之一。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值