Не могу вписать это в комментарий к ответу Нейла, поэтому мне придется более подробно здесь остановиться.
Относительно вашей функции expand()
. Похоже, что работа этой функции заключается в расширении внутреннего хранилища, в котором есть элементы comp
, элементами n
при сохранении size
вектора. Итак, давайте пройдемся по тому, что у вас есть.
void Vector::expand(int n) {
int * newdata = new int [comp * 2];
Хорошо, вы только что создали новый массив, который в два раза больше старого. Ошибка: почему новый размер не имеет ничего общего с n
?
if (*data != NULL) {
Ошибка: *data
- это первый int
элемент в вашем массиве. Это не указатель. Почему его сравнивают с NULL
?
Ошибка концепции: Даже если вы сказали if (data != NULL)
, что может быть проверкой, чтобы увидеть, существует ли вообще массив, в какой момент времени data
когда-либо установлен в NULL
? new []
не возвращает NULL
, если не хватает памяти; это исключение.
for (int i = 0; i <= (comp); i++) {
newdata[i] = data[i];
}
Предупреждение. Вы копируете весь массив, но допустимы только первые size
элементы. Цикл может просто дойти до size
, и все будет в порядке.
newdata -= comp;
Ошибка: неверный указатель математики. newdata
установлен на указатель, который знает, где (comp
int
s назад с начала newdata
?!), и почти наверняка указатель, который повредит память, если задан delete []
.
comp += n;
Это нормально, для чего это.
data = newdata;
delete newdata;
}
Ошибка: вы сохранили указатель и сразу же удалили его память, сделав его недопустимым указателем.
else if ( *data == NULL || comp == 0) {
data = new int [DEFAULT_VECTOR_SIZE];
comp = DEFAULT_VECTOR_SIZE;
size = 0;
}
}
Ошибка: это должно быть в вашем конструкторе, а не здесь. Опять же, ничто никогда не устанавливает data
в NULL
, а *data
является int
, а не указателем.
Что эта функция должна делать:
- создать новый массив
comp + n
элементов
- копирование
size
элементов из старого массива в новый
- удалить старый массив
- установить
data
для указания на новый массив
Удачи.