Я получаю ту же ошибку:

LEAKER: обнаружены ошибки! Обнаружены утечки: 2 выделения (48 байт). unknown: unknown (): 0 утечка памяти: память не освобождена. unknown: unknown (): 0 утечка памяти: память не освобождена.

Я продолжаю проверять свой деструктор и функцию Clear (), но не могу понять, что мне не хватает. Я знаю, что должен что-то удалить, но не могу понять, что мне нужно удалить. Когда я пытаюсь удалить голову или хвост, я получаю сообщение об ошибке, что указатель никогда не выделялся. Пожалуйста помоги!

-2
Becca 10 Окт 2021 в 21:21

2 ответа

Лучший ответ

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

class LinkedList
{
...
private:
    Node* head = new Node;          // Node pointer for the head
    Node* tail = new Node;          // Node pointer for the tail
    unsigned int count;   
}

А затем в вашем конструкторе

LinkedList<T>::LinkedList()
{
    // Default Constructor
    count = 0;
    head = nullptr;
    tail = nullptr;
}

Таким образом, вы заставляете инициализатор по умолчанию вызывать new, который выполняет выделение кучи. А затем в теле конструктора вы перезаписываете эти указатели на nullptr! Это сразу же утечка, теперь у вас нет ссылки на эти объекты, выделенные в куче, и вы не можете освободить память.

Первое, что я хотел бы попробовать здесь, это просто изменить код вашего заголовка на

class LinkedList
{
...
private:
    Node* head = nullptr;          // Node pointer for the head
    Node* tail = nullptr;          // Node pointer for the tail
    unsigned int count = 0;   
}

А затем проведите рефакторинг ваших конструкторов (им больше не нужно устанавливать указатели на nullptr или ваш count на 0). Более того, для конструктора по умолчанию вы можете просто объявить его как

    // Default Constructor
    LinkedList() = default;
0
Locke 10 Окт 2021 в 18:30

Вы не включили main. То, что вы опубликовали, - это просто определение класса, которое само по себе не просачивается. Однако легко привести пример утечки:

int main() {
    LinkedList<int> l;
}

Потому что у вас есть инициализаторы класса:

private: 
    Node* head = new Node;          // Node pointer for the head
    Node* tail = new Node;          // Node pointer for the tail
    unsigned int count;             // counting nodes in list
};

Затем конструктор по умолчанию отбрасывает указатели на выделенные Node и назначает nullptr:

template <typename T>
LinkedList<T>::LinkedList()
{
    // Default Constructor
    count = 0;
    head = nullptr;
    tail = nullptr;
}

Члены инициализируются перед запуском тела конструктора, и после запуска тела конструктора вы теряете любую ссылку на выделенные head и tail.

0
463035818_is_not_a_number 10 Окт 2021 в 18:28