malloc和自由循环。对象可能在被释放后被修改。

时间:2012-02-25 22:31:04

标签: c memory malloc free allocation

我已经创建了一个多级缓存模拟器,为了找到最佳性能缓存,我已经使循环循环了很长一段时间。

因为每个循环都在分配内存,所以使用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);
}

可能导致此内存问题的原因是什么? 我释放了我分配的确切内存,S1C1B1的值永远不会改变,直到下一个循环。

2 个答案:

答案 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的东西?