Каждый раз, когда я запускаю метод Loan & removeFirst() {}, моя программа продолжает сбой. Программа срабатывает всякий раз, когда я пытаюсь удалить временную структуру займа, которую я создал. Я могу показать некоторый фон для класса контейнера и кода для моей функции:
class ListOfLoans {
public:
//default constructor allocate appropriate heap storage
//store elements on heap array declared like this:
//new Loan*[initial_size];
ListOfLoans(int initial_size = 4) {
elements = new Loan*[initial_size];
numberOfElements = 0;
capacity = initial_size;
index = 0;
}
~ListOfLoans(void) {
cout << "Deleting \n";
delete [] elements;
}
// answer the first element from the list but don't remove it
Loan & first() const {
if (capacity == 0) {
cout << "Attempted on empty list. Exitting!" << endl;
exit;
} else {
return *elements[0];
}
}
// answer the first element from the list and remove it from the list
// if the resulting list is more than three quarters empty release some memory
Loan & removeFirst() {
index--;
if (capacity == 0) {
cout << "Attempted on empty list. Exitting!" << endl;
exit;
}
if(size() < capacity/4) { //shrink the container when 1/4 full
cout << "shrinking\n";
Loan **temp = elements;
elements = new Loan*[capacity/2];
for(index = (numberOfElements - 1); index >= 0; index--) {elements[index] = temp[index];}
capacity /= 2;
delete [] temp; // my program crashes at this line, I want to delete the temp structure
}
return first();
}
private:
Loan ** elements;
int numberOfElements; //number of elements in the list
int capacity; //size of the available array memory
mutable int index; //used to help with the iteration
};
При удалении массива указателей (указатель на указатель) вы обычно делаете следующее:
for(int i = 0; i < capacity; ++i)
{
delete temp[i];
}
delete [] temp;
Без цикла for вы будете просачивать память, которая находится во внутреннем указателе.
Возвращает ли size() числоOfElements? Меня беспокоит то, что ваш цикл loop копирует данные из temp в элементы и может начинаться за пределами диапазона temp. Если это так, вы можете перезаписать память, которая может быть источником сбоя. Почему бы не просто установить цикл от 0 до size()? Если вы хотите удалить первый элемент, просто скопируйте его со следующим:
elements[index] = temp[index+1];
Наконец, если вы удаляете первый элемент в списке, что делает first() внутри? Из того, что я вижу выше, кажется, что вы уже удалили первый элемент или намеревались. Если он удаляется, он может быть удален к моменту его возвращения, поэтому вам нужно будет скопировать этот указатель локально и попросить цикл for удалить все элементы, пропустив первый, чтобы у вас было что-то еще действительное для возврата!
Вы не предоставляете реализацию size(). Он просто возвращает numberOfElements? Если нет, это, вероятно, ваша проблема. Если numberOfElements> capacity/2, ваш цикл искажает кучу, что приводит к сбою в конце.
Если size() возвращает numberOfElements, я вижу много проблем с этим кодом, но не источник вашего сбоя, учитывая предоставленную вами информацию.