动态内存管理的核心知识点

动态内存管理?如何申请一个内存,如何释放一个内存.

咋们以前,是通过创建变量的方式来申请内存的,啥时候释放内存,就得看变量是啥样的变量了.内存释放的时机,其实是不太灵活的~

如果是全局变量,就跟随程序释放,如果是静态变量,也跟随程序释放,如果是局部变量,也就跟随代码块释放.

1.动态内存管理,能够更灵活的决定申请时机和释放时机~

2.动态内存管理可以在运行时决定内存申请的大小~

动态内存管理主要涉及到的几个关键库函数:

malloc,free,calloc,realloc

malloc 

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扩容后的内存空间,扩容之后的内存地址了,这个地址和之前的地址,可能相同也可能不相同,主要看这个扩容过程,是否触发了内存搬运.

动态申请到的内存,和普通的变量相比,所在在内存区域是不一样的~~

 

上一篇:小小调度器的优化版本:Tiny Macro OS for MCU


下一篇:[CLR]委托 Delegate 回调函数