Мой личный бложек. Пишу о жизни в Чехии, программировании и просто свои мысли обо всём. Пишу не часто.

 
Грёбаный garbage collector в D
Заметки не программиста
Lang:
struct Test
{
private void *ptr;

void start(size_t mem_sz)
{
this._ptr = GC.calloc(mem_sz, GC.BlkAttr.NO_MOVE | GC.BlkAttr.NO_SCAN | GC.BlkAttr.APPENDABLE);
}

@trusted ~this()
{
if (this._ptr)
{
GC.free(this._ptr);
}
}
}


Казалось бы хороший код, при выходе из scope вызывается деструктор структуры и очищает память. Но нет! Грёбаный garbage collector в D игнорирует GC.free, если он вызывается из деструктора. А аттрибут GC.BlkAttr.NO_SCAN не даёт автоматически очистить память. В результате происходит утечка памяти. Компилятор мог бы выдавать какой-нибудь warning при попытке использовать GC.free в деструкторе, но нет.

Решение:
заменить функции GC.calloc -> pureCalloc и GC.free -> pureFree
0