由于删除[]而导致程序无法退出

时间:2013-12-21 02:56:57

标签: c++ memory-management

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

3 个答案:

答案 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;