我创建了以下代码,但我不知道为什么Foo(3)
对象没有被销毁。我也删除了堆栈和寄存器上的引用(基于gdb info registers
命令)。
#include <stdio.h>
#include <gc_cpp.h>
class Goo : public gc_cleanup
{
public:
Goo(int id) : m_id(id) {
printf("%d Goo constructor...\n", m_id);
}
~Goo() {
printf("%d Goo destructor...\n", m_id);
}
private:
int m_id;
};
class Foo : public gc_cleanup
{
public:
Foo(int id) : m_id(id) {
printf("%d Foo constructor...\n", m_id);
m_goo = new Goo(id);
}
~Foo() {
printf("%d Foo destructor...\n", m_id);
}
private:
int m_id;
Goo* m_goo;
};
int main()
{
GC_INIT();
Foo* foo1 = new Foo(1);
Foo* foo2 = new Foo(2);
Foo* foo3 = new Foo(3);
foo1 = nullptr;
foo2 = nullptr;
foo3 = nullptr;
// Clear references from AX and BX.
__asm volatile("xor %rax, %rax");
__asm volatile("xor %rbx, %rbx");
GC_gcollect();
return 0;
}
代码输出:
1 Foo constructor...
1 Goo constructor...
2 Foo constructor...
2 Goo constructor...
3 Foo constructor...
3 Goo constructor...
1 Foo destructor...
2 Foo destructor...
手动触发GC清理(gc_gcollect)之后,仅释放Foo(1)
和Foo(2)
存储区。 Foo(3)
未销毁。请注意,如果释放了Foo
对象,则对应的Goo
对象似乎仍然可以访问(因为未执行Goo
销毁对象)。您知道这些经历的原因吗?
正如我检查的那样,如果gc_gcollect
被执行3次(在我的示例的最后),则Goo
析构函数将被执行。有什么方法可以知道应该(手动)触发GC清理以消除boehm-gc堆上所有未使用的对象多少次?
1 Foo constructor...
1 Goo constructor...
2 Foo constructor...
2 Goo constructor...
3 Foo constructor...
3 Goo constructor...
1 Foo destructor...
2 Foo destructor...
1 Goo destructor...
2 Goo destructor...