如何在程序退出之前强制boehm gc收集所有内容

时间:2013-05-29 02:44:30

标签: c++ garbage-collection

我现在正在学习boehm gc c ++界面。不使用它,只是好奇。我按照官方示例,编写可以GCed的类,在析构函数中,有一个输出,所以我可以判断一个实例是否是GC。 但是,只有当我使用一个循环来创建实例,就像一千个或更多的东西一样,才能触发gc集合。如果代码很简单:

class test_gc : public gc
{
public:
    ~test_gc()
    {
        cout << "~test_gc()" << endl;
    }
};

int main()
{
    GC_INIT();
    ::new (GC) test_gc();
    GC_gcollect();
    return 0;
}

似乎从未调用过析构函数。没有“~test_gc()”输出。此外,关闭编译器的优化。 我做了一些谷歌,几乎找不到任何东西,只有官方的例子。

请帮助我如何在程序退出之前强制执行gc集合,或者如果我使用错误,请告诉我如何以正确的方式使用它。 非常感谢。

3 个答案:

答案 0 :(得分:3)

  

我做了一些谷歌,几乎找不到任何东西,只有官方的例子。

The Boehm Collector for C and C++上的这篇Dr.Dobb's文章有一些很好的例子。

  

似乎从未调用过析构函数。

引用文章:

  

但是如果你想要调用析构函数,你必须自己删除对象。

答案 1 :(得分:0)

来自@ Shafik链接的文章:

  

如果你需要一个带有析构函数的新类,Boehm收集器会自动调用它,你可以继承Boehm收集器的类gc_cleanup。它类似于类gc,除了它安排Boehm收集器在回收实例的内存之前立即调用析构函数。请记住,您无法保证所有实例都将被回收。

答案 2 :(得分:0)

问题在于Boehm的收藏家是保守的 - 它不知道什么值是现场指针以及什么值不是,所以它扫描可能存在的所有内容并将其视为好像。在你的情况下,因为你刚刚在new之前调用了GC_collect,它可能会有一个指向寄存器或堆栈中某个对象的指针,这使得收集器认为它仍然存在。尝试将new放入从main调用的其他函数中,以便在调用GC_collect之前弹出其框架:

int func()
{
   ::new (GC) test_gc();
   return 0; /* overwrite the return value register so it doesn't contain the return value from ::new */
}
int main()
{
    GC_INIT();
    func();
    GC_gcollect();
    return 0;
}

这使得更有可能不存在存储在某处的对象的杂散指针,但是没有guarentees。