попытка освободить память вызывает ошибку - PullRequest
0 голосов
/ 21 марта 2012

Я объявил следующую структуру:

typedef struct _RECOGNITIONRESULT {
        int begin_time_ms, end_time_ms;
        char* word;
} RECOGNITIONRESULT;

Существует метод, который создает массив RECOGNITIONRESULT и заполняет его (только для целей тестирования):

void test_realloc(RECOGNITIONRESULT** p, int count){
    int i;
    *p = (RECOGNITIONRESULT *)realloc(*p, count * sizeof(RECOGNITIONRESULT));
    for (i = 0; i < count; i++){
        (*p)[i].begin_time_ms = 2*i;
        (*p)[i].end_time_ms = 2*i+1;
        (*p)[i].word=(char *) malloc ( (strlen("hello"+1) * sizeof(char ) ));
        strcpy((*p)[i].word,"hello");
    }
}

Методдля освобождения памяти это:

void free_realloc(RECOGNITIONRESULT* p, int count){
    int i = 0;
    if(p != NULL){
        if (count > 0){
            for (i = 0; i < count; i++){
                free(p[i].word);      //THE PROBLEM IS HERE.
            }
        }
        free(p);
    }
}

Основной метод вызывает эти методы следующим образом:

int main(int argc, char** argv)
{
    int count = 10;
    RECOGNITIONRESULT *p = NULL;
    test_realloc(&p,count);
    free_realloc(p,count);
    return 0;
}

Затем, если я пытаюсь освободить память, выделенную для "слова", я получаю следующееошибка:

ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ: после нормального блока (# 63) в 0x003D31D8.CRT обнаружил, что приложение записало в память после завершения буфера кучи.

Используя обнаруженный мной отладчик, происходит сбой при вызове free (p [i] .word);

Чтоя делаю не так?Как мне освободить память для струн?

Ответы [ 2 ]

4 голосов
/ 21 марта 2012

Проблема в том, что вы выделяете память для word. strlen("hello"+1) должно быть strlen("hello")+1.

0 голосов
/ 21 марта 2012

Поскольку вы, кажется, выделяете целый массив структур за один удар

RECOGNITIONRESULT **p;
*p = (RECOGNITIONRESULT *)realloc(*p, count * sizeof(RECOGNITIONRESULT));

Вы также можете бесплатно освободить их за один звонок ():

void free_realloc(RECOGNITIONRESULT *p, int count){
        free(p);
}

И strlen("hello"+1) также неверен, как обнаружил Чоулетт.

...