У меня есть этот код для управления динамической коллекцией List, которая в основном основана на коллекции .NET System.List, но написана на обычном C ++.
void List<T>::Insert(int index, T item)
{
if(index > GetLength() && index >= 0)
throw new StandartException("Index was out of array range");
if(GetLength()==length)
{
T * newl = new T[length + 4];
this->CopyTo(newl);
delete[] this->items;
this->items = newl;
length += 4;
}
T * store = new T[length];
CopyTo(store, index);
store[index] = item;
CopyTo((store + index + 1), index, GetLength() - index);
used++;
delete[] items;
items = store;
}
template <typename T>
void List<T>::CopyTo(T * destination, int start, int count)
{
for(int i = start, c = 0;i < GetLength() && c < count;i++, c++)
*(destination + i) = items[i];
}
Так что есть метод Insert, который должен вставить элемент по указанному индексу в массиве.
Во-первых, я проверяю, указан ли индекс в диапазоне от 0 до длины + 1 (потому что мне нужно иметь возможность добавить элемент в начало коллекции). Затем я проверяю, не является ли это концом выделенного массива (GetLength () = получает количество элементов в массиве, длина = количество выделенного пространства для элементов). Если это так, я выделяю новое пространство для массива, копирую фактические элементы, освобождаю старое хранилище и устанавливаю указатель на новый адрес.
После этого я снова выделяю новое пространство. Я копирую фактические элементы с нуля в индекс — 1, устанавливаю элемент, который нужно вставить в его позицию, и копирую другие старые элементы в свои индексы (их предыдущий индекс + 1). В конце я освобождаю старое пространство и добавляю новое.
ОШИБКА: Я начал отлаживать. Все было нормально, я запустил Insert для первого без проблем, но при первом удалении (delete[] this->items;
в блоке if) Я получил эту ошибку:
Кто-нибудь знает, почему я получаю это и как я могу его починить? Я думаю, что я нигде не разбирался в массиве.
Пожалуйста помоги.
Ваша проблема в этой строке:
T * store = new T[length];
Вы вставляете элемент, но не выделяете массив, который больше, чем раньше. Когда вы идете в CopyTo
новый массив, вы переполняете массив.
Других решений пока нет …