我现在正在学习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集合,或者如果我使用错误,请告诉我如何以正确的方式使用它。 非常感谢。
答案 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。