因此,我的程序将按预期执行,并输出正确的结果。唯一的问题是,完成后它不会退出。如果我再等待几秒钟,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;
}

最佳答案

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));

关于c++ - 由于删除[],程序未退出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20714936/

10-11 22:59
查看更多