Но программа прекратилась без причины.
Давайте посмотрим на этот цикл.Здесь вы удаляете элемент:
delete freelist;
И затем, после удаления, вы получаете доступ к нему в условии цикла:
while (freelist->next != nullptr)
Это неопределенное поведение.Вы получаете доступ к элементу, который вы удалили.Я бы предложил вместо этого сделать рекурсию, просмотреть список и удалить элементы на выходе.Возможно, что-то вроде
/** Delete a link and all the ones after it as well */
void recursiveDelete()
{
if (next){
next->recursiveDelete();
}
delete this;
}
А затем позвоните на freelist
.Кроме того, вам нужно удалить следующую перегрузку:
void operator delete(void* ptr)
{
((Link<E>*)ptr)->next = freelist;
freelist = (Link<E>*)ptr;
}
Так что, если я правильно понимаю, когда вы удаляете Link
, вы устанавливаете next
ссылки (которая собирается быть удаленаво всяком случае, так что ничего не делает), а затем вы установите freelist
для этой ссылки, которая теперь станет недействительной.Это приведет к удалению элементов.
Как указал Кристоф, удаление такого большого списка может привести к переполнению стека.Этого можно избежать, используя алгоритм, который не использует рекурсию.Вы можете попробовать что-то вроде этого:
/** Delete a link and all the ones after it as well */
void deleteAll()
{
std::vector<Link*> links;
Link* toDelete = this;
while (toDelete) {
links.push_back(toDelete);
toDelete = toDelete->next;
}
for (Link* i : links) {
delete i;
}
}