Софтуерно Инженерство
Loading...
+ Нов въпрос
l000p avatar l000p 11 Точки

Memory leak - може би ?? Task 5 - List SOLVED

Здравейте, имам затруднения с 5-та задача от домашното, наистина нямам идея от къде ми се натрупва памет и ще съм благодарен ако някой ме насочи в правилната посока. 
Предполагам че трябва да използвам smart pointer-и, но ми се иска да получа решение спрямо кода който съм написал. 

Решение: https://pastebin.com/eSgkfMPp - Получавам над 10 MB след тест 4... lameee ...

Тагове:
0
C++ Advanced 08/02/2020 00:01:04
galin_kostadinov avatar galin_kostadinov 163 Точки
Best Answer

Привет!

Може да погледнеш следните неща:

1. void List::addAll(const List& other){...}

Тук се иска да копираш стойностите от едини лист в другия, както е направено в момента ти правиш единия лист да ти е равен на другия по референция. Трябва да вземеш стойностите(values) една по една от other и да ги добавиш в настоящия лист, в него може да има стойности, като те се запазват.

 

2.  void List::removeFirst()

Предлагам ти следният вариант, макар че в случая и така рабати, то първо нищо не правиш по отношение на tail пойнтъра, ако имаш 0 елемента трябва да ти сочи към nullptr, другото е, че в момента не си сетнал предишния елемент на head да ти е nullptr, а сочи към освободена памет. :

void List::removeFirst() {
    if (size == 1) {
        delete this->head;
        this->head = nullptr;
        this->tail = nullptr;
        this->size--;
    } else if (size > 1) {
        Node *toDelete = this->head;
        this->head = this->head->getNext();
        this->head->setPrev(nullptr);
        delete toDelete;
        this->size--;
    }
}

 

3. List& List::operator=(const List& other)

Тук не освобождаваш паметта на настоящият обект, ако преди това е била заделена такава. Това си е memory leak

 

Поздрави!

1
l000p avatar l000p 11 Точки

Благодаря ! 

Facepalm-а след като прочетох последната точка беше епичен -_- 

On-topic: Някъде мога ли да намеря tool за проверка на memory leaks в дадена програма? Намерих Valgrind, който може да се използва на Linux, за съжаление аз работя в Windows среда, опцията е или да прекарам програмата през Wine или да намеря алтернатива на Valgrind ? По възможност open source. 

1