使用boehm-gc丢失重新分配

时间:2019-05-07 18:53:23

标签: boehm-gc

我创建了以下代码,但我不知道为什么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...

0 个答案:

没有答案