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

Имаш memory leak. В деструктора и в метода expandCapacity() освобождаваш паметта на масива arrayOfPointers, обаче паметта, към която сочи всеки един от пойнтерите в този масив, не се освобождава никъде.

0
j.petrov_90 avatar j.petrov_90 121 Точки

Привет, Пламен,

Надявам се, че сега си се наспал, че на лекцията май беше дошъл сънчо :D
Ще те помоля другия път да използваш отделението от форума, което е специално за "C++ Аdvanced“ курса.
Enough small talk. По същина:

Три реда делят решението ти от 100/100 на задачата. Имаш memory leak в твоето решение - това е проблема. По условие нямаш право на такова /не че, ако го нямаше в условието е ОК да leak-ваш памет де... :-} /

В скелета на задачата има заложена мина, на която ти си настъпил. Добре е скрита, така че е лесно човек да я пропусне.
В случай във функцията doRun(), която е част от main.cpp-то има динамично заделяне на памет за всяка компания.
Тази памет се прехвърля на твоя клас ArrayOfPointers да бъде менажирана.
Точно тази памет ти си забравил да освободиш в destructor-а си.

//това е твоят destructor
~ArrayOfPointers(){
    delete[] arrayOfPointers;
}
Ти освобождаваш паметта за масива от пойнтъри, но не и паметта зад самите пойнтъри.

//това е твоя destructor с малка добавка от мен
~ArrayOfPointers(){

        //добавих този for-цикъл към твоето решение и задачата ми даде 100/100
        for(size_t i = 0; i < numAdded; ++i){
            delete arrayOfPointers[i];
            arrayOfPointers[i] = nullptr;
        }

    delete[] arrayOfPointers;
}

П.С. Щастлив съм, че стриктно гониш правилото на 3те (The Rule of 3).
т.е. щом имаш destructor си имплементирал и copy-ctor/copy-assignment operator (макар и те да не се ползват в задачата).

Искам само да отбележа, ча имаш няколко грешки там:
1) В copy-ctor си направил една от основните грешки - не си си инициализирал променливите.

//това е твоята имплементация на copy-ctor
    ArrayOfPointers(const ArrayOfPointers& other){
        if(this!=&other){
            delete [] arrayOfPointers;
            numAdded=other.numAdded;
            arrayOfPointers=new Company*[other.numAdded];
            for(size_t i=0;i<numAdded;i++){
                arrayOfPointers[i]=other.arrayOfPointers[i];
            }
        }
    }

2)Ако copy-ctor-а ти някога беше изпълнен щеше да ти гръмне програмата със segmentation fault.
Защо? Защото на реда delete [] arrayOfPointers щеше да извищаш delete на памет, която все още не е заделена.
Как бихме го оправили?
Ами като добавим проверка дали arrayOfPointers != nullptr.
/Забележи, че това пак щеше да гръмне, ако не ти е инициализирана променливата на nullptr/


Жив и здрав ... и с под 500 от 500 до домашното да не съм те видял :)

0
plamen_vihren avatar plamen_vihren 2 Точки

It is a great pleasure to take such chalenge, but sometimes I can not find the correct syntax.

Thank you to everybody, that help me and all colleagues.

It is a great honour when the level of education is good.

Respectfully Plamen Nikolaev

0