2015-05-26 4 views
2

Я попытался решить дополнительный кредит exercise 16, хотя он скомпилирован должным образом, я получаю утечки памяти.
Теперь я понятия, что, если не используем таНос вообще нет никакого способа, программа будет утечка памяти, но здесь это делает, потому что когда я запускал команду:
Что такое утечки памяти в C?

  • valgrind --leak-check=full -v ./ex16-1
    я получил :

  • definitely lost: 21 bytes in 2 blocks

    • Так что теперь я хотел бы спросить, можно ли иметь утечек даже если не выделять какую-либо память (учитывая, что с моим источником ничего не случилось)?
    • Кроме того, если это возможно, то как освободить этот блок памяти?
      Где находится точка памяти?
      пс: Полный выход Valgrind доступен здесь: Pastebin-1
      И источник здесь: Pastebin-2
+3

. Ваши ссылки на пастообразные объекты обе идут в одно и то же место, и это было бы гораздо более читаемым, если бы вы вставляли исходный код в строку кода в любом случае. – ComputerDruid

+3

Строка 71ff сообщает вам, что именно не так: 'Person_create' вызывает' strdup', который называет 'malloc' внутренне, и вы не' free' указатель 'char *'. – Phillip

+0

Я серьезно не знал, что strdup использует malloc внутренне, я был действительно смущен, почему valgrind даже печатал malloc! Большое спасибо! – ArchKudo

ответ

3

Эта программа демонстрирует значительную утечку памяти. На многих системах он не будет работать очень далеко.

#include <memory.h> 

int add (int a, int b) 
{ 
     char *hog = malloc (1024 * 1024 * 1024 * 50); 
     return a + b; 
} 
int main (void) 
{ 
    int sum = add (add (6, 8), add (3, 7)); 
    return 0; 
} 

В случае вашей программы, он вызывает strdup() который вызывает malloc. Когда вы закончите с возвращаемым значением strdup, он должен быть освобожден.

+0

Когда я попытался открыть ссылку, мой firefox просто зависает, кто-нибудь знает почему? есть ли какие-то злые javascript в ссылках? –

+0

Те, что в вопросе. –

+0

@iharob: О, тогда вы должны прокомментировать вопрос, а не о каком-то случайном ответе. – wallyk

2

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

Если вы не используете malloc() но некоторые библиотеки вы используете или стандартная библиотечная функция делает, то утечка будет происходить, один из способов будет

void function() 
{ 
    FILE *file; 
    file = fopen("/some/path/file.txt", "r"); 
    /* check that file is valid and use it */ 
} 

Функция выше утечек памяти, потому что некоторые ресурсы, выделенные на fopen() не выпущены, вам необходимо до fclose(file) предотвратить утечку.

Используя valgrind, вы можете найти случаи, когда нет очевидного вызова malloc() или любых связанных функций в коде, но он сообщает выделенную память и, возможно, освобожденную память для вас.

+0

Обычно это * не * возвращается к O/S. Он возвращается в ретранслятор памяти RTL. Обычно библиотеки времени выполнения не освобождают память памяти пула памяти (которая отпустит ее на O/S). – wallyk

+0

Возможно, вы правы, но это техническая вещь, которая кажется нерелевантной, важно то, что 'free()' ed memory может быть повторно использована. –