动态内存管理?如何申请一个内存,如何释放一个内存.
咋们以前,是通过创建变量的方式来申请内存的,啥时候释放内存,就得看变量是啥样的变量了.内存释放的时机,其实是不太灵活的~
如果是全局变量,就跟随程序释放,如果是静态变量,也跟随程序释放,如果是局部变量,也就跟随代码块释放.
1.动态内存管理,能够更灵活的决定申请时机和释放时机~
2.动态内存管理可以在运行时决定内存申请的大小~
动态内存管理主要涉及到的几个关键库函数:
malloc,free,calloc,realloc
malloc功能就是能够在系统中申请到一块连续的内存空间.
size表示字节数,size_t类型,不能是负数,同样,不能给size传个0(未定义行为)
void*就表示这个申请到的连续内存空间的起始地址,这个内存空间的大小不知道,就知道这个地址,使用malloc的时候,往往需要根据实际情况,把得到的void*强制类型换成其他咋们需要的类型的指针
malloc得到的是连续的内存空间!!!因此malloc的返回值一定要做检查.通过if或者assert判断一下malloc的返回值是不是空
malloc申请到的内存,是啥时候释放呐?
1.程序如果运行结束,就跟随程序一起释放了.
1.程序没结束的时候,手动调用free,也就释放了.
free用法比较简单~
这个参数指的就是malloc返回值的地址,如果是其他的地址(不是malloc返回的地址,比如随便搞个地址,)此时都是未定义行为.
如果一个程序,光是malloc了,但是没有free会造成内存泄漏.
calloc也是动态的申请一个连续的内存空间~
calloc返回值仍然是一个连续内存空间的起始位置.
calloc申请到的内存,会被初始化为全0.
malloc申请到的内存,则不会初始化,内存上的值都是随机值.
realloc是要和free,以及和malloc/calloc搭配使用的,realloc的功能是针对动态申请的内存,进行扩容!
ptr就是一个动态申请到的内存空间~,size扩容后的内存空间,扩容之后的内存地址了,这个地址和之前的地址,可能相同也可能不相同,主要看这个扩容过程,是否触发了内存搬运.
动态申请到的内存,和普通的变量相比,所在在内存区域是不一样的~~