zoukankan      html  css  js  c++  java
  • malloc函数、calloc函数和free函数

    • malloc函数和free函数
      • malloc函数原型:void *malloc(long NumBytes)
      • malloc原型说明:mallco函数在堆分配了NumBytes个字节的内存空间,用来存放数据,并返回了指向该内存的指针,如果分配失败,则会返回一个NULL指针(申请到的实际空间要比申请的空间大),该内存空间在malloc函数执行完成后不会被初始化,它的值是未知的,如果希望在分配内存的同时初始化,请使用calloc函数,这在下面会有介绍。
      • free函数原型:void free(void *FirstByte)
      • free原型说明:free函数的作用就是将用malloc函数申请到的内存空间释放掉
    • 举个栗子:
     1 char* ptr = NULL;
     2 //malloc函数的参数表示申请一个可存储100个char类型的空间
     3 //由于malloc函数返回的是一个未知类型指针,所以需要强转成与自己申请数据匹配的类型
     4 //此处强转为char*
     5 ptr = (char*)malloc(100 *sizeof(char))
     6 
     7 //需要判断内存空间是否申请成功
     8 if (ptr == NULL){
     9     std::cout << “malloc failli.” << std::end;
    10     exit(1);    
    11 }
    12 
    13 //此时内存空间就已经申请成功了
    14 
    15 //接下来就是不再需要这块内存空间时,需要手动释放掉,可使用free函数
    16 free(ptr);
    17 ptr = NULL;
    18 //此处在将ptr释放掉之后还要置0是因为,free只是释放掉了申请的内存空间中的数据,但是p还是在指向着那块内存区域,用下面的例子说明会清晰一点
    19 int main(){
    20 char *ptr = NULL;
    21 ptr = (char*)malloc(100 * sizeof(char))
    22 print(“before free ,p = %p”,ptr);//%p类似于%s表示格式化的字符串,不过%p表示的是指针
    23 free(ptr);
    24 print(“after free,p = %p”,ptr);
    25 
    26 return 0;
    27 }
    28 
    29 //输出如下:
    30 before free,p = 0x8fa7008
    31 after free,p = 0x8fa7008
    32 //如此可见,free之后只是将内存中释放,但ptr还是指向那块内存区域,如果在后续还会对ptr进行判断的话,就会出现奇奇怪怪的事情
    33 //所以在free之后最好还是将其置为NULL

    Tip:

    • 申请内存空间存在申请失败的情况,所以在malloc之后需要检查是否申请成功,判断指针是否为NULL
    • 当不再使用内存时,需要手动释放掉,free之后要记得将指针置为NULL,以防止后面还会使用
    • malloc函数和free函数应该配对使用,申请不释放会造成内存泄露,要谨记只能释放一次,如果重复释放会报错(空指针除外)

          

    calloc函数:

    • 函数原型:void* calloc(size_t num,size_t size);
    • 函数说明:calloc函数在内存中动态的分配num个长度为size的连续空间,并将每一个字节都初始化为0,所以该函数是分配了(num*size)个字节长度的空间,并且每一个字节的值都为0.
    • 返回值:分配成功则返回指向该内存的地址,分配失败则返回NULL
    • 举例说明:
    1 char *ptr = (chae*)calloc(10,10);
    2 //分配10个大小为10字节的连续空间,并将这100个字节都初始化为0
    • calloc函数和malloc函数的最大区别就是calloc函数在动态分配内存之后会自动初始化该内存空间为0,而malloc函数不会进行初始化,申请的空间内都是未知的垃圾数据
  • 相关阅读:
    matlab中padarray函数在numpy、python中的实现
    MAC卸载/删除 Parallels Desktop虚拟机的方法
    CNMeM is disabled
    UbuntuServer14.04+CUDA7.5+CuDNNv3+Caffe+OpenCV3.0+配置
    npy数据的保存与读取
    update_TypeError
    Git操作流程,基本命令演示
    CSS 的优先级机制[总结]
    Git 进阶 —— 远程仓库
    Git实现从本地添加项目到远程仓库
  • 原文地址:https://www.cnblogs.com/danielStudy/p/6583150.html
Copyright © 2011-2022 走看看