我听过几次提到Ada支持垃圾收集 - 并且看着语言设计,它显然是考虑到这一点而设计的。
我有一个非实时的应用程序,垃圾收集真的非常有用。但是我没有看到任何关于我的编译器GNAT可用的垃圾收集器的提及。这让我很惊讶;甚至C通过简单地链接libgc来支持垃圾收集。
如果我只是将libgc添加到我的链接器行,它会工作还是会发生可怕的事情?
但是我没有看到任何关于我的编译器GNAT可用的垃圾收集器的提及。这让我很惊讶;甚至C通过简单地链接libgc来支持垃圾收集。
您可以使用针对JVM的GNAT。
我认为简单地链接libgc
的原因不会给你垃圾收集[至少据我所知]是因为GNAT没有任何关于如何使用它的概念。但是,鉴于GNAT使用GCC后端,我不明白为什么它不应该“只是工作”,如果它使用G / C.
我在这里找到了一个libgc绑定作为AdaCL库的一部分:http://adacl.sourceforge.net/
但是,libgc文档还说libgc无法看到存储在通过系统malloc()
分配的块中的指针。这意味着仅存储在从默认内存池分配的对象中的访问将不被视为根,并且可能在任何时候都无效。这取消了使用标准Ada容器存储访问可收集对象的资格!这也可能适用于辅助堆栈---但我不知道辅助堆栈的用途。
但是,我的调查显示垃圾收集天真地工作:
while true loop
p := new big_thing_t;
end loop;
......永远奔跑。所以这可能是理论上可行的,但是现在我觉得它不安全。