C++ free():无效的下一个大小(快速):0x0000000000f45160***

C++ free():无效的下一个大小(快速):0x0000000000f45160***,c++,arrays,runtime-error,memcpy,memset,C++,Arrays,Runtime Error,Memcpy,Memset,我已经了解到由于释放未分配的指针(例如,双重释放指针)而发生此错误,但在我的情况下,有问题的行如下所示: memset(data + prev_bytes, 0, sizeof(int) * size - prev_bytes); 当我把它注释掉时,错误就消失了。所以,我想我一定是在写我分配的缓冲区,但我不知道怎么写。我在出现问题的行之前添加了一些调试输出,如下所示: cout << "> address of `data`: " <&l

我已经了解到由于释放未分配的指针(例如,双重释放指针)而发生此错误,但在我的情况下,有问题的行如下所示:

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);
为了提供一点上下文,
data
是一个整数数组,我希望保持该数组的第一个
prev_字节
不变,同时清除其余字节,即设置为零

为了实现这一点,我将
memset
data
指针偏移
prev_bytes
开始,并写入大量的零。这个数字是:这个(动态分配的)数组的
大小
,乘以
sizeof(int)
(大概是4个字节),减去
上一个字节

我只是不明白我怎么能写下我分配的东西。如果需要更多的代码,下面是完整的函数。它只是将数组扩展到其大小的两倍

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);
}
void extend(int*&数据、int&大小、int&使用){
int-resize_因子=2;
int*new_buffer=new int[size*resize_factor];
int prev_bytes=sizeof(int)*大小;
memcpy(新的缓冲区、数据、上一个字节);
删除[]数据;
数据=新的缓冲区;
大小*=调整大小系数;

cout数组
data
被视为一个整数数组。通过使用指针算法
data+prev\u bytes
实际上被表示为
data+prev\u bytes*sizeof(int)
,缓冲区溢出

通过将
data
的地址与
data+prev_bytes
的地址进行比较,可以看出,它比32字节大128字节

我认为这是因为你是在添加后进行施法。请尝试在添加前进行施法

static_cast<void*>(data) + prev_bytes
static_cast(数据)+prev_字节

数组
数据
被视为一个整数数组。通过使用指针算术
数据+prev_字节
实际上被intereprated为
数据+prev_字节*sizeof(int)
,缓冲区溢出

通过将
data
的地址与
data+prev_bytes
的地址进行比较,可以看出,它比32字节大128字节

我认为这是因为你是在添加后进行施法。请尝试在添加前进行施法

static_cast<void*>(data) + prev_bytes
static_cast(数据)+prev_字节

我没有发现错误,但是我注意到
使用的
实际上没有使用。我假设
大小
指的是数组的容量,要复制的字节数应该取决于
使用的
大小(int)==sizeof(void*)
我问的原因是:
int prev_bytes=sizeof(int)*size;
然后:
memset(data+prev_字节,0,sizeof(int)*size-prev_字节);
你确定你把正确的地址传递给了memset吗?@FrançoisAndrieux-实际上这是个意外。我过去经常检查是否需要扩展数组(即
使用的
将超过
大小
)这里,但现在我在这个函数之外执行它。谢谢。我没有发现错误,但我注意到
使用的
实际上没有使用。我假设
大小
指数组的容量,要复制的字节数应该取决于
使用的
。是否
大小(int)=大小(void*)
?我问的原因是:
int prev_bytes=sizeof(int)*size;
然后:
memset(data+prev_bytes,0,sizeof(int)*size-prev_bytes);
你确定你把正确的地址传递给了memset吗?@FrançoisAndrieux-实际上这是个意外。我过去经常检查是否需要扩展数组(即使用的
将超过
大小
)在这里,但现在我在这个函数之外执行它。谢谢。不用强制转换指针,而是将
prev\u字节
切换到
prev\u项
。它大大简化了代码。不用强制转换指针,而是将
prev\u字节
切换到
prev\u项
。它大大简化了代码。