Деструктор вызывает ошибку сегментации

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

//Copy Constructor
Stack::Stack(const Stack &aStack)
{
size = 0; //this is incremented as new items are pushed onto the stack.
cap= aStack.cap;
items = new int[aStack.cap]();
for (int i = 0; i < aStack.size; i++)
this->push(aStack.items[i]);  //Adds an item if not full and increments size
// I have also tried: items[i] = aStack.items[i]
}

//Destructor
Stack::~Stack()
{
cap= 0;
size= 0;
delete [] items;
items = NULL;
}

У меня такое чувство, что я делаю конструктор копирования неправильно, но я не могу понять, что это такое.

1

Решение

Линия:

for (int i = 0; i < aStack.top; i++)

должно быть:

for (int i = 0; i < aStack.size; i++)

Это ошибка, потому что вы, вероятно, пытаетесь получить доступ к индексу вне диапазона или к чему-то похожему (неопределенная область поведения).

0

Другие решения

Ну, я нашел это. Я положу это здесь для всех, кто такой же глупый, как и я (без базовых знаний C ++), чтобы они не тратили часы на поиски того же, что и я.

Моя проблема заключалась в том, что деструктор работал «выборочно». Это работало в некоторых тестах, но не удавалось в других. Сравнив тесты по часам, я наконец нашел его.

Неудачные тесты завершились тестированием функции pop, продолжаясь до тех пор, пока стек не опустел.
В моем деструкторе есть строка, которая говорит
delete [] items;
Это было бы хорошо, если бы в моей функции pop не было строки items[size-1] = NULL;
Таким образом, каждый раз, когда pop удалял элемент, он обнулялся / удалялся до вызова деструктора. Из-за моих базовых знаний c ++ я не знал, что команда delete не может обрабатывать пустые массивы. Итак, я просто избавился от строки, которая удаляла элемент заранее (по сути, для конечного пользователя элемент больше не существует из-за инкапсуляции. Верхний индекс все еще изменяется, поэтому он больше не доступен)

Во всяком случае, последний урок: delete [] items; не обрабатывает пустые массивы (что, наверное, имеет смысл. Команда delete ожидает массива намного длиннее, чем мой последний массив).

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector