С ++ проблемный деструктор - PullRequest
0 голосов
/ 06 ноября 2011

Это школьное задание, и у меня большая его часть под контролем, но есть небольшая часть, которая создает утечку памяти, и у меня больше нет идей, как ее исправить.

Мы создали распределитель памяти, и проблема состоит в том, что эти две функции.

Этот первый нельзя изменить

void destroy (){
  free():
  tot_alloc = 0; }

Этот второй - тот, над которым я работаю

void free(){
  munmap(pool, PAGE_SIZE);
  Page* f = this;
  f = f->prev;
  if (f != NULL)
    f->destroy();
}

Я написал все функции free (), и меня попросили в вызове вызвать destroy (). Я понимаю, что эта функция не разрушает первое «это», потому что сразу же собирается f-> prev, но я понятия не имею, как заставить ее сначала уничтожить это и перейти к prev.

Надеюсь, это не слишком глупый вопрос.

Большое спасибо!

Nico

1 Ответ

2 голосов
/ 06 ноября 2011

Чтобы удалить элемент из односвязного списка, необходимо перейти к этому элементу, чтобы найти элемент перед ним в списке. Тогда вы должны «сшить» вокруг него. Как это:

void free()
{ // Note: This has no error checking!
    Page *f = tail, *next_f = NULL;
    while(f != this)
    { // find this node to find the node after this node
        next_f = f;
        f = f->prev;
    }

    // found it. Now, next_f is the node after this node.
    // close the chain so this link can go away
    if (next_f == NULL) // there is no node after us, we must be the tail
       tail = prev; // the tail is now whatever node is after us
    else // in the node after us, the node before it is now the node before us
       next_f->prev = prev; 

    destroy(); // we are unlinked from the chain so can now be freed
}
...