我已經創建了一個多級緩存模擬器,並找到最佳性能緩存,我已經做了很多循環。malloc和自由循環。對象可能在被釋放後被修改。?
由於每個迴路分配內存,使用malloc,我騰出不管它malloced,但是當我跑我得到這個錯誤:
「爲釋放對象不正確的校驗 - 對象被釋放後,可能被修改「
下面的代碼
下面的部分就是它分配內存:
/* 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
從未改變,直到下一個循環。
你能否整理格式化? – 2012-02-25 22:35:08
如果你在linux上,使用Valgrind找到它並停止燒製braincells :) – JimR 2012-02-25 23:09:23