我已经创建了一个多级缓存模拟器,为了找到最佳性能缓存,我已经使循环循环了很长一段时间。
因为每个循环都在分配内存,所以使用malloc,我释放了它所提出的任何内容,但是当我运行时出现了这个错误:
“释放对象的校验和不正确 - 对象可能在被释放后被修改”
这是代码的一部分
这是分配内存的地方:
/* cache1 */
if (S1 == 0) {
L1 = 1;
d_Cache1.cache_Array = (aBlock *)malloc((int)pow(2, (C1-B1)) * sizeof(aBlock));
/* static int cache1[(int)pow(2,(C1 - B1))]; */
} else if (S1 == C1-B1) {
L1 = 2;
f_Cache1.cache_Array = (aBlock *)malloc((int)pow(2, (C1-B1)) * sizeof(aBlock));
} else {
L1 = 3;
s_Cache1.cache_Array = malloc((int)pow(2, (C1 - S1 - B1))*sizeof(aBlock *));
if(s_Cache1.cache_Array == NULL){
fprintf(stderr, "out of memory\n");
return;
}
for (i = 0; i < (int)pow(2, (C1 - S1 - B1)); i++) {
s_Cache1.cache_Array[i] = malloc((int)pow(2, S1) * sizeof(aBlock));
if (s_Cache1.cache_Array[i] == NULL) {
fprintf(stderr, "out of memory\n");
return;
}
}
sc_Count1 = malloc((int)pow(2,S1) * sizeof(aBlock));
for (i = 0; i < (int)pow(2, S1); i++) {
sc_Count1[i] = 0;
}
}
在执行完所有操作后,它会释放出来:
//cache1
if (S1 == 0) {
free(d_Cache1.cache_Array);
} else if (S1 == C1-B1) {
free(f_Cache1.cache_Array);
} else {
for (i = 0; i < (int)pow(2, (C1 - S1 - B1)); i++) {
free(s_Cache1.cache_Array[i]);
}
free(s_Cache1.cache_Array);
free(sc_Count1);
}
可能导致此内存问题的原因是什么?
我释放了我分配的确切内存,S1
,C1
,B1
的值永远不会改变,直到下一个循环。
答案 0 :(得分:1)
很可能问题出在中间 - 至少,我看不到你对malloc的记忆做了什么。你只是把数组归零,还是用它做其他的事情? incorrect checksum for freed object - object was probably modified after being freed
经常来自粉碎你malloc的内存周围的内存内容(也就是索引超出范围)或者正是它正在告诉你的内容 - 在释放后修改内存内容 - 这是我最好的猜测发生了什么。
作为一种保护措施,当处于调试模式时,一些编译器将在内存周围放置一个校验和,以查看它在被释放后是否被修改,如果你修改它,它将与校验和不匹配。编译器告诉你,你正在搞乱你释放的一块内存的内容。通常,检查的额外成本仅在mallocing或freeing时发生,因此这似乎与这些调用相关联。
你可能正在跟踪你的malloc并且释放得很好,但接下来我要看的是你写入它时的内存状态。
答案 1 :(得分:0)
第一
s_Cache1.cache_Array = malloc的(...
然后
s_Cache1.cache_Array [I] = malloc的(..
在我眼中看起来有点可疑。 malloc已经被malloced的东西?