因此以下代码导致错误:
// free pointers created with malloc
for (int i = 0; i < 3; i++) {
if (rt_offset_rs[i] != NULL ) {
free(rt_offset_rs[i]); // <== AT THiS LINE
}
错误:0000000000331DD0处的堆块在0000000000331DE2处修改,超过请求的2 大小
我一点也不理解这个错误。以下是我操作指针rt_offset_rs:的代码
char** rt_offset_rs;
rt_offset_rs = malloc(3 * sizeof(char*));
if (rt_offset_rs == NULL ) {
fprintf(outputFilePointer, "no more memory");
exit(1);
}
for (int i = 0; i < 3; i++) {
rt_offset_rs[i] = malloc(2 * sizeof(char));
if (rt_offset_rs[i] == NULL ) {
fprintf(outputFilePointer, "no more memory");
exit(1);
}
}
错误不在free()
调用中,而是在此之前的某个地方,只有您的系统只在某些情况下检查溢出,其中一个是free
,而不是在每次写入缓冲区时。
它不是代码的一部分,但似乎您分配了两个字节,并向缓冲区写入至少3个字节(如果它是字符串-不要忘记null终止符是另一个字节)
我在执行以下操作时遇到了这个问题。
#include <malloc.h>
int main()
{
const char* s = "123";
void** p = (void**)malloc(1);
*p = (void*)s;
free(p);
}
该代码在x64内部版本中调用以下错误:
HEAP[XXX.exe]:000001C207A21D60处的堆块在修改000001C207A21DA5超过请求的35 大小
该代码在Win32构建中调用以下错误:
检测到HEAP腐蚀:在0x00636110处的正常块(#93)之后。CRT检测到应用程序在堆结束后写入内存缓冲器
malloc行错误。应该这样修改:
void** p = (void**)malloc(1*sizeof(void*));
因为指针的大小是sizeof(void*)
字节,而不是一个字节!