malloc и free в циклах. объект, вероятно, был изменен после освобождения.?

Я создал многоуровневый симулятор кеша, и, чтобы найти лучший кеш производительности, я довольно долго делал циклы, которые зацикливаются.

Поскольку каждый цикл выделяет память, с помощью 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 никогда не меняются до следующего цикла.


person user1233113    schedule 25.02.2012    source источник
comment
Не могли бы вы привести в порядок форматирование.   -  person Ed Heal    schedule 26.02.2012
comment
Если вы используете Linux, используйте Valgrind, чтобы найти это и перестать сжигать мозговые клетки :)   -  person JimR    schedule 26.02.2012


Ответы (2)


Вполне возможно, проблема посередине - по крайней мере, я не вижу, где вы что-то делаете с памятью, которую вы malloc. Вы просто обнуляете массив или делаете с ним что-то еще? incorrect checksum for freed object - object was probably modified after being freed часто возникает из-за разрушения содержимого памяти вокруг памяти, которую вы выделили (то есть, индексации за пределами границ), или делает именно то, что он говорит вам - модифицирует содержимое памяти после их освобождения - и это мое лучшее предположение о том, что происходит.

В качестве меры защиты в режиме отладки некоторые компиляторы помещают контрольную сумму вокруг памяти, чтобы увидеть, изменяется ли она после освобождения, и если вы изменяете ее, она не будет соответствовать контрольной сумме. Компилятор сообщает вам, что вы возитесь с содержимым освобожденного участка памяти. Часто дополнительная стоимость проверки возникает только при распределении или освобождении, поэтому кажется, что это связано с этими вызовами.

Вы можете отлично отслеживать свой malloc и освобождать, но следующее, на что я хотел бы обратить внимание, это состояние памяти, когда вы записываете в нее.

person Matt    schedule 25.02.2012

первый

s_Cache1.cache_Array=malloc(...

тогда

s_Cache1.cache_Array[i]=malloc(..

В моих глазах выглядит немного подозрительно. malloc что-то внутри чего-то уже распределено?

person Simon    schedule 25.02.2012
comment
Это на самом деле довольно часто. malloc массив указателей, затем malloc каждый элемент. - person Ismail Badawi; 26.02.2012
comment
Спасибо, я собирался спросить, не могли бы вы что-то сделать. - person Simon; 26.02.2012