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项
。它大大简化了代码。