malloc и свободный в петлях. Объект, вероятно, был изменен после освобождения. - PullRequest
0 голосов
/ 26 февраля 2012

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

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

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

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

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

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

0 голосов
/ 26 февраля 2012

первый

s_Cache1.cache_Array = таНос (...

тогда

s_Cache1.cache_Array [I] = таНос (..

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

...