2012-02-25 46 views
0

我已經創建了一個多級緩存模擬器,並找到最佳性能緩存,我已經做了很多循環。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); 
} 

什麼導致這個內存問題? 我正在釋放我分配的確切內存,並且值S1C1,B1從未改變,直到下一個循環。

+1

你能否整理格式化? – 2012-02-25 22:35:08

+0

如果你在linux上,使用Valgrind找到它並停止燒製braincells :) – JimR 2012-02-25 23:09:23

回答

1

很可能問題在中間 - 至少,我沒有看到你對malloc的內存做了什麼。你只是把數組清零了,還是你用它做了其他的事情? incorrect checksum for freed object - object was probably modified after being freed通常來自粉碎你malloc'd內存的內存內容(也就是索引超出範圍),或者完全按照它告訴你的內容 - 在釋放內存後修改內存內容 - 這是我對發生的事情的最佳猜測。

作爲一種保護措施,當處於調試模式時,某些編譯器會在內存中加入一個校驗和以查看它在被釋放後是否被修改,如果修改了它,它將不會與校驗和相匹配。編譯器告訴你你正在搞亂你已經釋放的一塊內存的內容。通常情況下,檢查的額外費用僅在mallocing或釋放時發生,所以這似乎與這些調用相關聯。

您可能正在跟蹤您的malloc並釋放得很好,但接下來我要看的是您寫入內存時的狀態。

0

第一

s_Cache1.cache_Array = malloc的(...

然後

s_Cache1.cache_Array [I] = malloc的(..

看起來有點可疑在我眼裏,malloc裏面的東西已經是malloce了d?

+2

這實際上很常見。 'malloc'指針數組,然後'malloc'每個元素。 – 2012-02-25 22:51:19

+0

謝謝,我會問是不是你可以做的事情。 – Simon 2012-02-25 22:58:35

相關問題