所以我的程序按预期执行并打印出正确的结果。唯一的问题是它完成后不会退出。如果我再等几秒钟,Windows会弹出一条错误消息“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();
}
注意我注释掉的两行。如果没有它们,程序将执行并完成(尽管现在结果不正确)。更改指针值或删除它可能会使我的程序有这个奇怪的错误是什么?此外,我非常确定数据是有效的,因为我在上面的代码中使用它。
我也是通过Netbeans编译G ++。
在进一步检查后,似乎问题可能出在我的解构器上。如果我在解构器中注释掉delete []数据,则错误似乎消失了。我不知道为什么。
BigInt::~BigInt()
{
if(data) delete[] data;
}
答案 0 :(得分:1)
您必须非常小心匹配new和delete的使用。如果使用new的数组形式分配内容,则必须使用delete数组形式删除它。如果你混合和匹配数组和非数组形式,你会遇到这样的崩溃。你也绝不能删除那些没有用new分配的东西,你绝不能两次删除相同的东西。
我无法向您提供有关此特定程序的任何更具体的建议,因为您没有告诉我们指定名为data的指针的位置。
答案 1 :(得分:1)
for(int i = 0; i < digs; ++i)
*new_data++ = 0;
此代码修改 new_data
指针指向的位置,以便在您进入后续循环时不再指向原始数组,或者对其执行任何操作那件事。传递给delete[]
的指针必须指向new[]
返回的相同内存地址。
对数组进行零初始化的正确方法是改为:
for(int i = 0; i < digs; ++i)
new_data[i] = 0;
或者,摆脱循环,只需使用memset()
:
memset(new_data, 0, digs * sizeof(base_int));
答案 2 :(得分:1)
我明白了。我设法搞砸了我的new_data指针。
for(int i = 0; i < digs; ++i)
*new_data++ = 0;
我改变了它。
for(int i = 0; i < digs; ++i)
new_data[i] = 0;