您的位置:首页 > 博客中心 > 网络系统 >

进程环境详解(五)---堆分配malloc、free函数详解

时间:2022-04-03 12:16

    堆上的空间不是连续的,栈上的空间是连续的。          使用malloc函数可以获得堆上的内存空间,注意一点虽然堆上的空间是不连续的,但是调用一次malloc函数分配的是还是连续的内存。     比如malloc(10)会在堆上找到一片有10个字节大小的连续空间分配给用户程序,然后再调用一次malloc(5)会在堆上找到一片有5个字节大小的连续空间给用户程序,这两次分配的空间并不是连续的。       使用malloc分配的内存空间需要用户调用free()函数手动来释放,不释放会造成内存泄漏。但是也不能使用free()函数多次释放同一片内存空间,因为第一次释放以后,该片内存就不属于用户程序了,再次释放可能会导致内存出错。所以为了防止这种情况,在使用free()函数释放空间后,要立即置指针为NULL,这样即使再次调用free()函数释放,由于参数是NULL,根据man手册可以知道,free函数不会有任何的操作。 ================================================================

  • 利用realloc函数可以用来更改已分配堆上内存的大小。realloc函数如果调用成功的话会返回一个新的指针指向新的内存地址,而且会free掉之前已经分配的内存空间,所以要注意最后不可再重复释放原来的内存空间,如果调用失败,则返回NULL,且原来的内存区域不会做任何改变,所以一般不用ptr = realloc(ptr, size);这种语句,如果返回失败,ptr就会变成NULL,原来的内存区域再也找不回来了。
  void *realloc(void *ptr, size_t size); 其中size为更改后的空间大小。 realloc(NULL, size)  < == > malloc(size); realloc(ptr, 0)  < == > free(ptr);  
  • void *calloc(size_t nmemb, size_t size);
 calloc函数和malloc函数类似,在堆上分配nmemb*size大小的内存空间。比malloc增加的内容就是calloc函数会将分配的内存内容全部清零。
  • alloca函数和malloc系列函数不同,利用它来申请的内存空间是栈上的,在函数返回后,该片内存片会自动释放。

热门排行

今日推荐

热门手游