2015-12-27 3 views
1

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

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

так вот моя функция чтения буфера (C псевдокод)

char *read_buffer(char *buf, myStruct **arr, int nbElm) 
{ 
    buf = malloc(...); 
    ...//many things done (use of the read(),close()... functions 
    ...//but not referencing any of the buffer to my structure 
    ... 
    *arr = (myStruct *) = malloc(sizeof(myStruct) * nbElm); 
    return (buf); 
} 

Вот вид функции я использую между моим распределением памяти и мое освобождение попытка:

void using_struct(myStruct *ar, int nbElm) 
{ 
    int i; 

    i = 0; 
    while (i < nbElm) 
    { 
     // Here I use my struct with no problems 
     // I can even retrieve its datas in the main scope 
     // not memory is allocated to it. 
    } 
} 

мой основная функция:

int main(void) 
{ 
    char *buf; 
    myStruct *arStruct; 
    int nbElm = 4; 

    buf = read_buffer(buf, &arStruct, nbElm); 
    using_struct(arStruct, nbElm); 
    free(buf); 
    buf = NULL; 
    free(arStruct); 
    while(1) 
    {;} 
    return (1); 
} 

Единственная проблема заключается в том, что я устанавливаю цикл while до или после моего свободная функция, я не вижу изменений в памяти, используя top на моем терминале. Это нормально?

Спасибо заранее,

+0

вы должны '' free' asStruct' только один раз, а не в цикле. – ameyCU

ответ

2

Вы всегда должны иметь точно такое же количество звонков бесплатно в качестве звонков таНос.

myStruct **arr; 
*arr = malloc(sizeof(myStruct) * nbElm); 

Это означает, что вам нужно один вызов, чтобы освободить первые nbElm структур:

free(arr); 
+0

Хм, хорошо, это работает, но когда я замораживаю свою программу, я не вижу изменения в моей программе? (используя верхнюю часть моего терминала mac) – JSmith

+0

Я еще раз проверил вас и расскажу вам. Любые советы (команда утечки FYI не работает) Thx :). – JSmith

+0

@jonhatansmith, если вы хотите проверить изменение памяти, отлаживаете свою программу и проверяете память с помощью команды gdb x, например x/4xw обр. Посмотрите на колонку VIRT сверху, а не на RES, которая является реальной используемой памятью. Если вы на самом деле не пишете или не читаете память, которую вы malloced, ОС может не дать вам эту память в реальности, но только скажите, что вы ее получите в конечном итоге, если попытаетесь записать или прочитать в эту память (и вызвать ошибку страницы в ядро). Используйте [strace] (http://linux.die.net/man/1/strace) для отслеживания всех системных вызовов, сделанных вашей программой. – 4pie0

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