malloc、calloc、realloc的区别与联系
在c语言/C++中和内存申请与释放的相关函数有:alloc、malloc、calloc、realloc、free. 1》alloc是在栈上申请空间,无需用户主动释放,当函数执行结束时,在栈上分配的内存会被自动释放,栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存有限。 2》malloc在堆上申请分配内存,并且没有初始化内存的内容,因此要调用memset函数来初始化这部分内存空间。 3》calloc也是在堆上申请内存,和malloc类似,但是会初始化申请到的内存,设置为0. 4》realloc在堆上申请空间,对malloc申请的空间大小进行调整,若原来没有申请空间,则作用和malloc相同。 所有在堆上申请的空间都要通过free函数释放,如果在堆上申请了空间而没有用free函数来释放,就会造成内存泄漏。一部分内存没有在使用,但是因为没有free导致系统仍认为这部分内存还在使用,造成向系统不断申请内存但不释放,使得系统中可用内存不断减少,但是内存泄漏仅仅指在程序运行时,程序退出时,OS将会回收所有资源。但对某些系统常驻进程而言,要是存在内存泄漏则往往是致命的。
函数原型:
void* malloc (size_t size); void* calloc (size_t num, size_t size); void* realloc (void* ptr, size_t size); 这三个函数的头文件均为,这三个函数的返回值都是请求系统分配的地址,若请求失败则返回NULL.
1> malloc函数:在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址。 2> calloc函数:和malloc类似,参数size为申请地址的元素类型的大小(即单个元素的长度),num为要申请的元素的个数,则最后在内存中申请的空间为num*size字节大小的连续的地址空间。并且用0初始化每个元素 3> realloc函数:对给定的指针所指向的空间进行扩大或缩小,且无论进行哪种操作原有内存中的内容都会保持不变。当然缩小后,超出的那部分内容会被丢弃。realloc并不保证调整后的内存空间和原来的内存空间保持统一内存地址,也就是说realloc函数返回的指针很可能会指向一个新的地址。
分析: 1> 上面三个函数返回的都是void*类型,void*表示未确定类型的指针,而C和C++规定,void*类型可以强制转换为任何其他类型的指针。 2> realloc函数可以从堆上分配内存,当要扩大一块内存空间时,realloc函数试图直接从堆上现存数据后面的那些字节中获得附加的字节,如果可以满足则最好,如果数据后面的字节不够,那么就使用堆上第一个足够大的可以分配的内存块,然后将原内数据拷贝到新的内存,而老的内存里的数据不懂只是和指针失去联系而被放回内存池。