Могу ли я вызвать публичную функцию в деструкторе для освобождения памяти? - PullRequest
0 голосов
/ 26 ноября 2018

Я реализую LinkedList.Вместо того, чтобы переделывать работу, могу ли я повторно использовать открытую функцию, которую я написал, чтобы удалить и освободить узлы (тоже память) в деструкторе.Вывод получается хорошим / правильным, но мне интересно, что я пропустил за сценой.Я видел это , но моя главная проблема в том, правильно ли я делаю это с точки зрения освобождения памяти в моем коде C ++.

Мой деструктор:

~LinkedList(){
    Node *next = head;
    while(head != NULL){
        DeleteEndVal();
    }
}

Моя публичная функция DeleteEndVal ();:

// delete value from the end of the list
int DeleteEndVal(){
    if(CheckListEmpty() == true){
        cout << "Empty list. Nothing to delete." << endl;
        return -1;
    }
    else{
        int val;
        Node *prev;
        Node *cur;
        if(head->next == NULL){
            val = tail->data;
            head = NULL;
            tail = NULL; 

        }
        else{
            prev = head;
            cur = head->next;
            while (cur->next != NULL){
                prev = prev->next;
                cur = cur->next;
                val = cur->data;
            }
            prev->next = NULL;
            free(cur);
        }
        return val;
    }
}

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете вызвать функцию внутри своего деструктора, поэтому сначала ответьте на свой оригинальный вопрос: Да, все в порядке.

Хотя есть несколько других аспектов:

Во-первых, вы не должныперекодировать основную концепцию, например, связанный список вручную.Это подвержено ошибкам и / или может быть неэффективной реализацией.Вместо этого используйте базовые классы или стандартные библиотеки C ++.

Когда вы придерживаетесь своего кода, мне интересно, почему:

  • в деструкторе есть Node *next = head;.ИМХО, он ничего не делает.
  • у вас, кажется, есть атрибут tail.Если метод удаляет хвостовой элемент (возможно, переименуйте его DeleteTail), то вам не следует проходить через весь связанный список.Вместо этого возьмите хвост, получите его предыдущий элемент (я предполагаю, что ваш связанный список является двунаправленным) и обновите эту ссылку вместо этого.
  • , как следствие, ваша текущая реализация имеет вложенный цикл while для уничтожения списка, принимая порядка n * n во времени.В случае использования уничтожения вам даже не нужно обновлять элементы, использовать простой цикл while и уничтожать их без повторного связывания.
...