Итак, моя программа выполняется так, как ожидалось, и выводит правильный результат. Единственная проблема заключается в том, что после ее завершения он не выходит. Если я подожду еще несколько секунд, появится окно с сообщением «bignumbs.exe перестает работать». Вот код новой функции, которая, кажется, вызывает проблему.Программа не выходит из-за удаления []
void BigInt::u_basic_mult(const BigInt& n, int digs)
{
const base_int* tptr = n.used > used ? n.data : data;
const base_int* bptr = tptr == data ? n.data : data;
const int tlen = tptr == data ? used : n.used;
const int blen = bptr == data ? used : n.used;
if(digs < 1)
digs = tlen + blen + 1;
base_int* new_data = new base_int[digs];
for(int i = 0; i < digs; ++i)
*new_data++ = 0;
for(int i = 0; i < blen; ++i)
{
int stop_pt = MIN(tlen, digs - i);
overflow_int carry = 0;
overflow_int btmp = bptr[i];
for(int j = 0; j < stop_pt; ++j)
{
overflow_int prod = btmp * tptr[j] + carry;
carry = prod >> BASE_BITS;
overflow_int sum = new_data[i + j] + carry + (prod & MAX_DIG);
carry += sum >> BASE_BITS;
new_data[i + j] = sum;
}
}
//delete[] data; these two lines cause the error
//data = new_data;
used = digs;
alloc = digs;
strip_zeros();
}
Обратите внимание на две строки, которые я прокомментировал. Без них программа выполняет и заканчивает (хотя теперь результат неверен). Что это значит изменить значение указателя или удалить его, что может сделать мою программу этой странной ошибкой? Также я уверен, что данные действительны, так как я использую их в приведенном выше коде.
Также я компилирую с G ++ через Netbeans.
После осмотра дальше кажется, что проблема может быть с моим деконструктором. Если я прокомментирую данные delete [] в деконструкторе, кажется, что ошибка исчезла. Я не знаю почему.
BigInt::~BigInt()
{
if(data) delete[] data;
}
вызов 'delete' на' null' в порядке, нет необходимости в проверке. –
Вы можете рассмотреть 'std :: vector data'. –
Jarod42