关于malloc和free
这两个函数共同维护一个可用内存池,当一个程序需要一些内存空间时就调用malloc函数,这个函数就从内存块中提取一块儿合适的内存,并向调用程序返回一个指向该块内存的指针,注意,这个被分配的内存空间并没有以任何方式对其进行初始化,因此如果需要对这块内存进行初始化,就需要程序员手动写代码来初始化。并且这个函数分配的是连续的内存空间,如果内存池中的可用内存无法满足要求,malloc函数就会向系统提出申请,要求得到更多的内存,并在这块新内存上分配任务,如果操作系统无法向malloc函数提供更多的内存,malloc就会返回一个null 指针。malloc函数并不知道分配的内存空间将会存储什么样的数据类型,因此它将返回一个 void 的指针类型,标准规定一个void * 类型的指针可以转换为任何其他类型的指针。对于要求边界对齐的机器,malloc返回的内存其实位置总能满足对边界要求最严格的类型的要求。
calloc和realloc
calloc和malloc的区别在于,calloc在返回指向内存块的指针之前会将内存块初始化为0,另一个区别在于,calloc函数包含两个参数一个是所需元素的数量,另一个是每个元素所z需要的字节数,这两个参数都是与需要将内存块初始化为0有关系。
realloc函数用于扩大或缩小原来分配的内存空间,若用于扩大,则原内存块中的值依然保留,增加的内存块添加到原有内存块的后面,心内存块并未以任何形式进行初始化,如果用于缩小一个内存块,则内存块尾部的部分内容将被拿掉,剩余部门内容依然保留。如果原有内存块无法改变其大小,则realloc将重新分配一块内存,并将原先内存块的值复制到这块新内存上,因此使用realloc之后,就不能使用指向原来内存块的指针,而应该使用指向新内存的指针。
动态内存分配错误包括:对null 指针进站解引用操作、对分配的内存进行操作是越过边界、释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后继续使用。
free函数只能释放从malloc和realloc、calloc函数返回的指针指向的内存。且释放就是指向的内存块全部释放,不能只释放其中的一部分。
注意不要引起内存泄露。