vczh/vczh_toys

请教一下轮子哥CppGarbageCollection的原理

Closed this issue · 2 comments

gc_ptr 如何确定root集?假如在对象的构造函数中调用 make_gc 会不会出问题?谢谢!

vczh commented

make_gc<T>的最终目的是获取T*sizeof(T)(记为A),这就构成了一个内存地址的范围。然后每一个gc_ptr<T>内部都能用this获取到gc_ptr<T>*(记为B)。我就是通过计算哪些B落在哪些A里面,来最终构造出对象的关系图的。那些不在任何A里面的B,就是root。

所以这个做法其实是有缺陷的,譬如说vector<gc_ptr<T>>就会导致GC工作不正常,所以所有的容器都得为了gc_ptr<T>都特化一遍,这个我没有做。

感谢轮子哥!cpp实现gc真的蛋疼,我写了一个写着玩的是用内存位置区分引用是不是在栈上,用引用的raii管理root集,当然标准的c++似乎没有提供方法判断地址是不是在栈上