2015-10-16 3 views
0

У меня есть следующий результат после использования valgrind для проверки утечек памяти.До сих пор доступная память в C

HEAP SUMMARY: 
==10299== in use at exit: 2,286 bytes in 68 blocks 
==10299== total heap usage: 139 allocs, 71 frees, 164,646 bytes allocated 
==10299== 
==10299== LEAK SUMMARY: 
==10299== definitely lost: 0 bytes in 0 blocks 
==10299== indirectly lost: 0 bytes in 0 blocks 
==10299==  possibly lost: 0 bytes in 0 blocks 
==10299== still reachable: 2,286 bytes in 68 blocks 
==10299==   suppressed: 0 bytes in 0 blocks 
==10299== Reachable blocks (those to which a pointer was found) are not shown. 
==10299== To see them, rerun with: --leak-check=full --show-leak-kinds=all 
==10299== 
==10299== For counts of detected and suppressed errors, rerun with: -v 
==10299== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Моя цель - сделать так, чтобы утечка памяти была невозможна. Я знаю, что я должен освободить память после использования функции malloc. но даже в этом случае он все равно дает мне тот же результат. Следовательно, мне нужна помощь, чтобы увидеть, что что-то не так с моим кодированием.

ниже мой код.

struct date 
{ int day; 
    int month; 
    int year; 
}; 

Date *date_create(char *datestr) 
{  
    //declare Date to pointer from datestr and check the data size of Date 
    Date *pointer = (Date *) malloc (sizeof(Date)); 

    if(pointer!=NULL) 
    { 
     scanf(datestr,"%2d/%2d/%4d",pointer->day,pointer->month,pointer->year); 
    } 
     else 
    { 
      printf("Error! "); 
     date_destroy(pointer); 

    } 
     return pointer; 

} 

void date_destroy(Date *d) 
{ 

    free(d); 
} 


int main(){ 
return 0; 
    } 
+1

Является ли это на самом деле код, который вы пробежал Valgrind? Этот код ничего не делает, потому что функция 'main' просто возвращается. Поэтому трудно поверить, что valgrind создаст этот отчет для данного кода. И код определенно не завершен - 'Date' не является определенным типом. – kaylum

+0

Отправьте MCVE. И проверьте, что 'int main() {}' не дает ошибок. –

+0

'scanf()' -> 'sscanf()', 'Date' не определено, а ваш' main() 'ничего не делает. –

ответ

0

Если вы вызываете свою функцию из main, тогда valgrind покажет вам утечку памяти в вашем коде. Вы не должны бросать malloc. Если вы успешно распределите память, вы сможете освободить ее. Вы должны изменить код, как этот

Date *date_create(char *datestr) 
{  
    //declare Date to pointer from datestr and check the data size of Date 
    Date *pointer = malloc (sizeof (Date)); 

    if(pointer!=NULL) 
    { 
     scanf(datestr,"%2d/%2d/%4d",pointer->day,pointer->month,pointer->year); 
    } 
     else 
    { 
      printf("Error! "); 
    // date_destroy(pointer); Not required 

    } 
    if(pointer) { // Free the allocated memory after use 
     date_destroy(pointer); 
    } 
     return pointer; 

} 
+0

Это нормально, чтобы освободить нулевой указатель, так что часть кода не нуждается в модификации –

+0

@MM это нормально, но все же ему нужно добавить часть свободной и свободной памяти (NULL), ничего не делать, почему мы должны делать свободно()? – Mohan

+0

yup. Проблема решена. Cheers –

0

Ваш код установлен в free указатель, когда malloc возвращает NULL, но free(NULL) ничего не делает.

После того, как вы закончили использовать указатель, вам необходимо позвонить по номеру free().

int main(void) { 
    char datestr[64]; 
    Date* dptr; 

    fgets(datestr, sizeof(datestr), stdin); 

    dptr = date_create(datestr); 

    /* do some stuff with Date ptr */ 

    free(dptr); /* now call free */ 

    return 0; 
} 

Кроме того, в вашем date_create() функции, вы используете scanf, когда я думаю, что вы хотите использовать sscanf.

Так эта линия

scanf(datestr,"%2d/%2d/%4d",pointer->day,pointer->month,pointer->year); 

становится

sscanf(datestr,"%2d/%2d/%4d",pointer->day,pointer->month,pointer->year); 
Смежные вопросы