C语言动态内存分配

1.动态内存分配的意义

C语言中的一切操作都是基于内存的,变量和数组都是内存的别名,内存分配由编译器在编译期间决定,定义数组的时候必须指定数组长度,数组长度是在编译期就必须确定的。
程序运行的过程中,可能需要使用一些额外的内存空间,我们有这样的需求。

malloc和free用于执行动态内存分配和释放。
我们需要内存来存放程序的时候,就使用malloc函数向操作系统申请一段内存空间,借了就要还,使用free函数归还申请的内存空间,不归还会导致内存泄漏。
C语言动态内存分配_第1张图片

2.malloc和free

malloc所分配的是一块连续的内存,以字节为单位,并且不带任何的类型信息。
free用于将动态内存归还系统。

void* malloc(size_t size);
void free(void* pointer);

注意的点:
(1)malloc和free是库函数,而不是系统调用。
(2)malloc 实际分配的内存可能会比请求的多,例如你申请3个字节的内存空间,而操作系统是以4字节分配内存空间的,那么就会给你分配4字节的空间,比你要的空间要大。为了更好的移植性,我们不能依赖于不同平台下的malloc行为。
(4)当请求的动态内存无法满足时malloc返回NULL,即申请失败。
(5)当free的参数为NULL时,函数直接返回

有个疑问:malloc(0);将返回什么?

我们动态申请的内存,包括了起始地址和长度,有返回值说明我们申请成功了,所以说malloc(0)是合法的,但是长度为0,无法使用这内存空间。

还有个疑问,如果不停地申请malloc(0);,会导致内存泄漏吗?
答案是会,每次malloc(0)可能在操作系统上已经得到四字节的内存了,所以申请完都要free释放掉。java等语言就有垃圾自动回收机制,而C语言没有,我们需要手动释放掉。

实例分析:内存泄漏检测模块
test.c

#include 
#include "mleak.h"

void f()
{
   
    MALLOC(100);//动态申请100字节内存,但是没有返回值free,肯定会造成内存泄漏
}

int main()
{
   
    int* p = (int*)MALLOC(3 * sizeof(int));//申请一个数组,大小为3,每个元素为int类型
    
    f();
    
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    
    FREE(p);//释放p,这个是大写的free
    
    PRINT_LEAK_INFO();//打印当前内存泄露的信息
    
    return 0;
}


mleak.c

#include

你可能感兴趣的:(C/C++,c语言)