进程环境详解---堆分配mallocfree函数详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程环境详解---堆分配mallocfree函数详解相关的知识,希望对你有一定的参考价值。

    堆上的空间不是连续的,栈上的空间是连续的。
    
    使用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系列函数不同,利用它来申请的内存空间是栈上的,在函数返回后,该片内存片会自动释放。

以上是关于进程环境详解---堆分配mallocfree函数详解的主要内容,如果未能解决你的问题,请参考以下文章

(转载)C++内存分配方式详解——堆栈自由存储区全局/静态存储区和常量存储区

java程序运行时内存分配详解

java程序运行时内存分配详解

内存管理 malloc free 的实现

程序中内存从哪里来2之堆内存详解

linux环境内存分配原理 mallocinfo