因此以下代码导致错误:
// 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);
}
}
答案 0 :(得分:2)
错误不在free()
调用,但在此之前的某个地方,只有您的系统仅在某些情况下检查溢出,其中一个是free
,而不是每次写入缓冲区
它不是你的代码的一部分,但似乎你分配了两个字节,并且至少将3写入缓冲区(如果它是一个字符串 - 不要忘记null终止符是另一个字节)
答案 1 :(得分:0)
当我做类似跟随的事情时,我遇到了这个问题。
Device device = new Device(this);
device.validateLogin();
代码在 x64 构建中调用以下错误:
HEAP [XXX.exe]:修改为000001C207A21D60的堆块 000001C207A21DA5过去要求的尺寸为35
代码在 Win32 版本中调用以下错误:
HEAP CORRUPTION DETECTED:在正常块(#93)之后的0x00636110处。 CRT 检测到应用程序在堆结束后写入内存 缓冲液中。
malloc线是错误的。它应该像这样修改:
#include <malloc.h>
int main()
{
const char* s = "123";
void** p = (void**)malloc(1);
*p = (void*)s;
free(p);
}
因为指针的大小是void** p = (void**)malloc(1*sizeof(void*));
个字节,而不是一个字节!