免费():下一个尺寸无效(快速):0x0000000000f45160 ***

Posted

技术标签:

【中文标题】免费():下一个尺寸无效(快速):0x0000000000f45160 ***【英文标题】:free(): invalid next size (fast): 0x0000000000f45160 *** 【发布时间】:2017-02-28 20:46:10 【问题描述】:

我已经阅读过由于释放未分配的指针(例如双重释放指针)而发生的此错误,但在我的情况下,违规行如下所示:

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 完整,同时清除其余部分,设置为零。

为了实现这一点,我从data 指针偏移prev_bytes 开始memset,并写了许多零。这个数字是:这个(动态分配的)数组的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);

【问题讨论】:

我没有发现错误,但我注意到used 实际上并没有被使用。我假设size 指的是数组的容量,而要复制的字节数应该取决于used sizeof(int) == sizeof(void*) 吗?我问的原因是:int prev_bytes = sizeof(int) * size; 然后:memset(data + prev_bytes, 0, sizeof(int) * size - prev_bytes); 你确定你将正确的地址传递给 memset 吗? @FrançoisAndrieux - 这实际上是个意外。我曾经在这里检查是否需要扩展数组(即used 将超过size),但现在我在此函数之外进行。谢谢。 【参考方案1】:

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

你可以通过比较data的地址和data + prev_bytes的地址来看到。它增加了 128 个字节,而不是 32 个。

我认为这是因为您在添加后进行投射。在添加之前尝试转换。

static_cast<void*>(data) + prev_bytes

【讨论】:

不投射指针,而是将prev_bytes 切换为prev_items。它大大简化了代码。

以上是关于免费():下一个尺寸无效(快速):0x0000000000f45160 ***的主要内容,如果未能解决你的问题,请参考以下文章

在 CDialog 中显示尺寸夹点?

C 错误 - free():下一个大小无效(快速)

程序员编程代码 用啥字体好看?

0x000000 16进制颜色代码第一个0表示啥意思,为啥要0x后面的颜色代码呢?

随机错误核心转储:`./a.out' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储)

geekuninstaller姓无效