Loading...
Yoana_Borisova avatar Yoana_Borisova 4 Точки

2.Duplicates - Polomorphism Excersice

 Здравейте! Опитвам се да реша задача 2 от упражнението за поломорфизъм, но ми изписва exit code -1073741819 (0xC0000005) след като рънна тестовете. Доколкото разбрах от това, някъде достъпвам чужда памет, но не мога да открия точно къде.  След като* i е зададено на нълпойнтер си мислех, че ще влезе в първата проверка, но я подминава. Затова въпроса ми е как мога да проверя дали вече съм изтрила дадената компания?

 

 

bool sort(Company* c, Company* d){
    return c->getName()<d->getName();
}

void removeDuplicates(std::list<Company*>& companies){
    companies.sort(sort);
    std::string currName;


    auto i = companies.begin();

    while (i != companies.end()) {
        if(*i== nullptr){
            i = companies.erase(i);
            continue;
        }
        Company* c = *i;

        if(currName==c->getName()){
            delete c;
            *i= nullptr;
            i = companies.erase(i);
            continue;
        }
        else if(currName!=c->getName()){
            currName=c->getName(); i++;
        }
    }
}

 

Тагове:
1
C++ OOP 29/08/2021 11:52:11
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Йоанче,

Справила си се прилично със задачата.
Грешката ти е, че не си прочела хубаво условието (и не си разгледала скелета).

И на двете места (условие и скелет) може да се види, че имаш много пойнтъри дубликати, които сочат към една и съща диначмична памет (компания).
Грешката ти е, че за всеки пойнтър ти викаш delete.
Какво става когато се извика 2 пъти delete на една и съща памет? Става бум (или респективно в твоят случай exit code различен от 0).

Също така виждам, че сортираш компаниите за да можеш да разбереш кои 2 съседни са "дубликати".
Това е вярно, но има доста по-елегантен и бърз начин.
Подсказка: когато говорим за дублиране, често можем да го завъртим, че всъщност търсим уникалните елементи.
Коя беше тази структура от данни, която ни гарантираше уникалност на елементите?

Поздрави

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