2013-04-03 5 views
0

Я получаю ошибку утверждения (выражение: crtisvalidheappointer), когда я пытаюсь освободить свой круговой буфер. Почему это происходит?не может освободить память (ошибка утверждения)

Соответствующие Структуры:

typedef struct quote { 
    unsigned int seconds; 
    double rate; 
} quote; 

typedef struct cbuf { 
    unsigned int max; 
    unsigned int start; 
    unsigned int end; 
    unsigned int size; 
    quote *quotes; 
} cbuf; 

Блок кода, который mallocs и освобождает:

#define INITIAL_SIZE 10 
static cbuf cb1 = {INITIAL_SIZE, 0, 0, 0, NULL}; 
cb1.quotes = (quote*)malloc(INITIAL_SIZE * sizeof(quote)); 
if(cb1.quotes == NULL) 
{ 
    printf("Error - memory allocation failed."); 
    exit(1); 
} 

free(&cb1); 
+0

Вы освободив локальную переменную стека. SideNote: Не бросайте 'malloc()' при программировании на C. Его плохая привычка. – WhozCraig

+3

Вы хотите 'free (& (cb1.quotes))', так как 'cb1.quotes' - это то, что вы выделили для памяти для – maditya

ответ

5
free(&cb1); 

Вы пытаюсь освободить память, где cb1 проживает, но

static cbuf cb1 = {INITIAL_SIZE, 0, 0, 0, NULL}; 

, который не был malloc ред.

free(cb1.quotes) 

- то, что вам нужно, чтобы освободить.

4

Вы не можете освободить то, что вы не выделили:

free(&cb1); 
+0

. Правильно .. я слишком долго кодировал. – rcj

0

единственное, что вы должны помнить: вы можете освободить только память, которую вы динамически выделяемый

в вашем случае, вы динамически распределяемой памяти для «cb1.quotes» не для CB1 поэтому вы должны free cb1.quotes не cb1.

касаемо

Хомс

Смежные вопросы