Ошибка отладочного утверждения: 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, если это возможно.