2014-01-20 3 views
0

Я только учусь C и не понимаю, почему этот маленький кусочек коды вызывает утечку памяти:Освободить память, которая была выделена с таНосом/Valgrind ошибка

mem_ptr=(char*)malloc(24); 

if (mem_ptr == NULL){ 
    exit(EXIT_FAILURE); 
} 

mem_ptr="TEST"; 
printf("%s\n",mem_ptr); 

free(mem_ptr); 

Когда я запускаю его, Valgrind говорит мне :

==17900== Invalid free()/delete/delete[]/realloc() 
==17900== at 0x4C2B75D: free (vg_replace_malloc.c:468) 
==17900== by 0x40086F: main (main.c:69) 
==17900== Address 0x40099f is not stack'd, malloc'd or (recently) free'd 
==17900== 
==17900== 
==17900== HEAP SUMMARY: 
==17900==  in use at exit: 24 bytes in 1 blocks 
==17900== total heap usage: 1 allocs, 1 frees, 24 bytes allocated 
==17900== 
==17900== LEAK SUMMARY: 
==17900== definitely lost: 24 bytes in 1 blocks 
==17900== indirectly lost: 0 bytes in 0 blocks 
==17900==  possibly lost: 0 bytes in 0 blocks 
==17900== still reachable: 0 bytes in 0 blocks 
==17900==   suppressed: 0 bytes in 0 blocks 
==17900== Rerun with --leak-check=full to see details of leaked memory 
==17900== 
==17900== For counts of detected and suppressed errors, rerun with: -v 
==17900== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 
+3

'mem_ptr = "TEST"' не копирует строку в вашу выделенную память, он просто переписывает указатель. –

ответ

2

Вы пропустили strcpy():

mem_ptr=(char*)malloc(24); 
mem_ptr="TEST"; 

Это выбросил только указатель на allocat пространство. Когда вы попытались освободить "TEST", тогда valgrind пожаловался, что не было выделено памяти (и это было правильно). И вы уже пропустили 24 байта, которые вы выделили.

Исправлено:

mem_ptr = (char*)malloc(24); 

if (mem_ptr == NULL) 
    exit(EXIT_FAILURE); 

strcpy(mem_ptr, "TEST"); 
printf("%s\n", mem_ptr); 

free(mem_ptr); 
+0

Спасибо! Это работает. Не понимаю, почему, но, я думаю, я буду, когда буду дальше через учебники. – user26242

+0

Исследование строк и указателей. Проблема в том, что C-образное копирование должно выполняться с помощью 'strcpy()' или одного из его родственников. Помните: 'mem_ptr' - просто указатель. Вы можете присвоить ему значения через 'malloc()' - как вы это делали, совершенно правильно. Вы также можете присваивать ему значения, такие как буквальная строка, которая изменяет указатель, адрес, на который он указывает. Назначение не копирует символы вокруг; он меняет только указатель. Это отличается от большинства других языков, которые вы, возможно, узнали (Python, Perl, Java, C#, ...). –

+0

Я удалил бросок, так что исправленный код действительно исправлен. –

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