Отсутствие освобождения с помощью boehm-gc - PullRequest
0 голосов
/ 07 мая 2019

Я создал следующий код, и я не знаю, почему объект 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...
...