Ошибка отладочного утверждения: dbgheap.cpp и dbgdell.cpp

У меня какая-то проблема с утечкой памяти. У меня было это в более ранних строках, но я исправил это, написав конструктор присваивания копии. Но проблема на delete newB линия. Когда я закомментирую эту строку, появляется другая ошибка. Как вы думаете, у меня есть утечки памяти, потому что я знаю, что это как-то связано с распределением памяти.

void BankingSystem::addBranch(const int id, const string name){
    if(isBranchExisting(id)){
        cout << "\n\tBranch " << id << " already exists. Please try it with another id number.";
    }
    else if(!isBranchExisting(id)){
        Branch* tempArray = new Branch[cntBranches];
        if(cntBranches != 0){
            for(int i = 0; i<cntBranches; i++){
                tempArray[i] = allBranches[i];
                }


            delete[] allBranches;

            allBranches = new Branch[cntBranches+1];
            for(int i = 0; i<cntBranches; i++){
                allBranches[i] = tempArray[i];
            }

            allBranches[cntBranches] = Branch(id, name);
            delete[] tempArray;
        }
        Branch* newB = new Branch(id,name);
        allBranches[cntBranches] = *newB;
        cout << "\n\tBranch " << id << " is added successfully.";
        delete newB;
        cntBranches++;
    }
}

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

Изменить: Извините, я думал, что я это сказал.

1 ответ

Это терпит неудачу, потому что первоначально cntBranches==0 и allBranches, как я предполагаю, неинициализированы.
Таким образом, при первом вызове addBranch
allBranches [cntBranches] = * newB;
запишет в какую-нибудь случайную область памяти, указанную мусором во всех ветвях.
Остальные манипуляции с указателями некорректны и также приведут к ошибкам. Например
удалить [] tempArray;
удалит все, что было выделено ранее, оставив все ветви, указывающие на удаленные объекты. Поэтому я бы посоветовал либо узнать больше о том, что такое указатель и как работает выделение памяти, либо использовать std::vector, если это возможно.

Другие вопросы по тегам