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