垃圾收集何时发生,程序启动和程序结束之间?

时间:2013-07-18 14:42:57

标签: garbage-collection c++-cli

在程序启动和程序结束之间何时发生垃圾收集?

我正在使用C ++ / CLI,但这更像是关于垃圾收集的一般问题。 我不确定在程序完成后是否真的会发生垃圾收集, 那是在您的程序进程被杀死之后。或者也许所有垃圾收集 程序结束前完成了吗?

由于

4 个答案:

答案 0 :(得分:3)

只有在分配内存时才会触发垃圾回收。在特定情况下,第0代堆没有足够的空间来满足请求。所以不,你的程序终止时你不会得到一个,这不太可能是你分配任何东西的地方。

GC执行了一项特殊的辅助作业,它还为任何具有一个的对象运行终结器。终结器负责释放非内存的操作系统资源。与文件句柄,字体,设备上下文等一样。它们通常在之后为任何收集的对象运行垃圾收集,假设您没有以其他方式自行处理该对象。

CLR 运行这些终结器,就在AppDomain卸载并且程序终止之前。

答案 1 :(得分:2)

C ++没有实现任何类型的垃圾收集。

如果您的应用程序使用RAII对象,则应当通过堆栈展开收集其资源,只要其中一个超出范围(即,在范围的末尾调用析构函数)或抛出异常时。

您可以实现与RAII实现分开的自己的垃圾收集(例如,如果您有一个高吞吐量的线程,不能浪费时间等待删除调用,您可以将指针传递给一个负责的单独线程删除它们)。在这种情况下,答案是“取决于你如何实现它”。

在支持垃圾收集的语言中实现的应用程序中,它取决于实现。

答案 2 :(得分:1)

答案简短:你不知道,也不应该知道。除非您处于内存受限的环境中,否则它应该无关紧要,但在这些情况下,您为什么首先使用托管代码?

就你的问题而言,当你的研究时,所有的.NET语言都共享一个运行时,所以它们拥有相同的垃圾收集器。 .NET只能看到IL代码;它不关心你是用C#还是用C ++ / CLI编写的。因此,您应该搜索“.NET垃圾收集器何时运行”,(首先点击谷歌)将一个引导至this SO question。阅读几个答案,你应该得到你需要知道的东西。

答案 3 :(得分:0)

基本上GC在开始时运行,根据您声明为静态或全局的所有CLI / .Net对象构建其托管内存表示(不确定它是否可以通过CLI)

在执行GC跟踪管理引用期间,如果代码不再引用1,则应该清除它

  system::string^ st = gcnew system::string; //(1)
  st = gcnew system::string ; (2)

这里(2)覆盖由(1)创建的引用,GC应该在(1)处创建你的ref(内存)并将其放入内存列表中以释放! 因为我认为在运行可能占用CPU和时隙的东西之前等待有一大堆内存要清理!

它在最后运行以清除您使用“gcnew”分配的所有对象。而且都是静态和全局的。