堆内存详解
1、操作系统堆管理器:堆管理器是操作系统的一个模块,堆管理内存分配灵活,按需分配。
2、大块内存:堆内存管理着总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。
3、程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。
4、脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的。
5、临时性:堆内存只在malloc和free之间属于我这个进程,而可以访问。在malloc之前和free之后都不能再访问,
否则会有不可预料的后果。
6、void *是一个指针类型,malloc返回的是一个void *类型的指针,实质上malloc返回的是堆管理器分配给我本次申请的那段内存空间的首地址(
malloc返回的值其实是一个数字,这个数字表示一个内存地址)。为什么要使用void *作为类型?主要是因为malloc帮我们分配内存时只是分配了内存空间,
至于这段空间将来用来存储什么类型的元素malloc是不关心的,由我们程序自己来做决定。
7、什么是void类型,早期被翻译成空型,这个翻译非常不好,会误导人。void类型不表示没有类型,而是表示万能类型。void的意思就是说这个数据的类型
当前是不确定的,在需要的时候可以再去指定它的具体类型。void *类型是一个指针类型,这个指针本身占4个字节,但是指针指向的类型是不确定的,换句
话说这个指针在需要的时候可以被强制转化成其他任何一种确定类型的指针,也就是说这个指针可以指向任何类型的元素。
8、malloc的返回值:成功申请空间后返回这个内存空间的指针,申请失败时返回NULL。所以malloc获取的内存指针使用前一定要先检验是否为NULL。
9、malloc申请的内存使用完后要free释放。free(p);会告诉堆管理器这段内存我用完了你可以回收了。堆管理器回收了这段内存后,这段内存当前进程就不应该
再使用了。因为释放后堆管理器就可能把这段内存再次分配给别的进程,所以你就不能再使用了。
10、再调用free归还这段内存之前,指向这段内存的指针P一定不能丢(也就是不能给P另外赋值)。因为p一旦丢失,这段malloc来的内存就永远的丢失了(内存泄漏),
直到当前程序结束时操作系统才会回收这段内存。
11、gcc中的malloc默认最小是以16Byte为分配单位的,如果malloc小于166Byte的大小时都会返回一个16字节大小的内存。malloc实现时没有实现任意自己的分配而是允许
一些大小的块内存的分配。
|