最后就是GC了,这块折磨了我亿小会,由于比较菜不知道realloc重新分配会修改之前的地址导致程序一直 -1073740940
先说下基本思路:
1.用一个List存储new出来的对象
2.再用一个List存储这些对象创建的动态内存空间。
3.写一个通用结构体,里面就放一个int型的计数值,通过对象强转从而得到该对象的计数值
4.采用最简单的计数法实现对象回收,长时间不调用的话到点就会执行回收,并free掉对象指针以及该对象分配的动态内存空间。
5.这里长时间不调用会被回收,那么什么是调用呢?
#define list $(LLL)
#define test $(TTT)
TEST TTT=new(TEST);
List LLL=new(List);
只要使用了list.和test.就算是调用,计数器就会清掉,并且把this指针切换成当前对象
或者你可以这样调用$(LLL).和$(TTT)效果是一样的。
上个图:
首先是GC.h


结构很简单,两个List一个用来装new出来的对象,一个用来装这些对象产生的数据
_Data这个结构体中的Belonger用来存储数据的产生者(是哪个对象创建该数据的),Value用来存储数据指针。到时候删除对象的时候,把Belonger和该对象相同的数据也删了。
然后是函数实现:

GC_Init()函数中初始化了两个List并开启了线程用于执行GC
GC_Run()里面不断判断每个对象的计数值,超过了阈值就清掉该对象和对应的数据
GC_Clear()提供给用户主动调用,直接清掉你不要的对象
GC_Run()里面不断遍历对象List,通过把List中的对象强转成通用结构体Template来获取该对象的计数值,如果超过了阈值,就清掉该对象,然后去遍历数据List,通过Belonger判断该对象是否创建了数据,如果有,就把其创建的数据也清掉。
逻辑比较简单,可以正常实现基本功能,基本满足单片机任务中的对象回收需求。
最后放个List类里面有关gc的代码
扩容时:

缩容时:

删除数据:
