Loading...
kolioi avatar kolioi 641 Точки

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

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

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

Надявам се, че сега си се наспал, че на лекцията май беше дошъл сънчо :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
Prilder1987 avatar Prilder1987 -1 Точки

Software University is a website that has a post about advanced tasks. You must follow this custom essay services to learn new things related to education. They help people to use their keypad and Syntax correction. You can also make an account on it for use. They also have a Cyrillic keyboard which gives you a 50 % solution of it.

-1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.