free():下一个大小无效(快):0x0000000000f45160 ***

时间:2017-02-28 20:46:11

标签: c++ arrays runtime-error memcpy memset

我已经读过由于释放未分配的指针而发生的错误(例如双重释放指针)但在我的情况下,违规行看起来像这样:

memset(data + prev_bytes, 0, sizeof(int) * size - prev_bytes);

当我发表评论时,错误消失了。所以,我想我必须写过我分配的缓冲区,但我不知道如何。我在违规行之前添加了一些调试输出,如下所示:

cout << ">                 address of `data`: " << static_cast<void*>(data) << endl;
cout << ">                      `prev_bytes`: " << prev_bytes << endl;
cout << ">    address at `data + prev_bytes`: " << static_cast<void*>(data + prev_bytes) << endl;
cout << ">                            `size`: " << size << endl;
cout << "> `sizeof(int) * size - prev_bytes`: " << (sizeof(int) * size - prev_bytes) << endl;
memset(data + prev_bytes, 0, sizeof(int) * size - prev_bytes);

输出是:

>                 address of `data`: 0xf450f0
>                      `prev_bytes`: 32
>    address at `data + prev_bytes`: 0xf45170
>                            `size`: 16
> `sizeof(int) * size - prev_bytes`: 32
free(): invalid next size (fast): 0x0000000000f45160 ***

为了给出一个小上下文,data是一个整数数组,我想保持这个数组的第一个prev_bytes完整,同时清除其余部分,设置为零。

为实现这一点,我memsetdata指针偏移prev_bytes开始,并写入多个零。该数字为:此(动态分配)数组的size,乘以sizeof(int)(可能是4个字节),减去prev_bytes

我只是看不出自己如何写过我已分配的内容。如果需要更多代码,这里是完整的功能。它只是将数组扩展到其大小的两倍。

void extend(int*& data, int& size, int& used) {
    int resize_factor = 2;
    int* new_buffer = new int[size * resize_factor];
    int  prev_bytes = sizeof(int) * size;
    memcpy(new_buffer, data, prev_bytes);
    delete [] data;
    data = new_buffer;
    size *= resize_factor;
    cout << ">                 address of `data`: " << static_cast<void*>(data) << endl;
    cout << ">                      `prev_bytes`: " << prev_bytes << endl;
    cout << ">    address at `data + prev_bytes`: " << static_cast<void*>(data + prev_bytes) << endl;
    cout << ">                            `size`: " << size << endl;
    cout << "> `sizeof(int) * size - prev_bytes`: " << (sizeof(int) * size - prev_bytes) << endl;
    memset(data + prev_bytes, 0, sizeof(int) * size - prev_bytes);
}

1 个答案:

答案 0 :(得分:3)

数组data被视为整数数组。通过使用指针算术data + prev_bytes实际上被解释为data + prev_bytes * sizeof(int)并且你溢出缓冲区。

您可以通过将data的地址与data + prev_bytes的地址进行比较来查看。它大128个字节,而不是32个字节。

我认为这是因为你在添加后正在施法。在添加之前尝试进行强制转换。

static_cast<void*>(data) + prev_bytes