Что такое утечка памяти в структурах? Как мы можем исправить это? - PullRequest
2 голосов
/ 26 декабря 2011

меня спросили в интервью

Что такое утечка памяти в структурах? Как мы можем исправить это?

Может ли кто-нибудь помочь мне понять утечку памяти в структуре?

Ответы [ 3 ]

5 голосов
/ 26 декабря 2011

Я полагаю, что очевидным ответом будет то, что утечка в структуре - это когда указатель, который указывает на выделенную память, находится в структуре, и структура выходит из области видимости до освобождения памяти, на которую указывает ее член. Это можно исправить, освободив любую память, на которую указывает структура, перед освобождением (или выпуском из области видимости) структуры.

Уверен, это то, что задал вопрос ...:)

1 голос
/ 26 декабря 2011

Пожалуйста, посмотрите на Динамическое распределение памяти в C

Распространенные ошибки, возникающие при динамическом выделении / освобождении памяти, следующие [которые объясняются здесь ]

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

Наиболее распространенные ошибки:

  • Ошибка выделения: Распределение памяти не гарантируется успешно. Если проверка успешного размещения не реализована, это обычно приводит к сбою программы или всей системы.
  • Утечки памяти: Неспособность освободить память с помощью free приводит к накоплению памяти, которая не является повторно используемой памятью, которая больше не используется программой. Это приводит к напрасной трате ресурсов памяти и может привести к сбоям при выделении ресурсов, когда эти ресурсы исчерпаны.
  • Логические ошибки: Все распределения должны следовать одной и той же схеме: распределение с использованием malloc, использование для хранения данных, освобождение с использованием free. Отказ придерживаться этого шаблона, например использование памяти после вызова free или перед вызовом malloc, повторный вызов free и т. Д., Обычно приводит к сбою программы.

Вышеупомянутое применимо к structures, а также к другим конструкциям C.

Надеюсь, это поможет!

1 голос
/ 26 декабря 2011

Важно помнить следующее:

Динамическая память всегда выделяется, а также освобождается явно.

Каждый раз, когда вы выделяете память для указателя с помощью malloc и явно не вызывать free для одного и того же указателя / передача того же адреса на free, это приводит к утечке памяти

В случае структур, когда у вас есть элемент указателя, которому выделена динамическая памятьиспользуя malloc, тогда следует явно указать free d, если free не будет выполнен, это приведет к утечке памяти.

Пример кода:

#include<stdio.h>
#include<string.h>
#include <stdlib.h>

struct MyStruct
{
    char *str;
    int i;
};

int main()
{
   struct MyStruct *ptr = (struct MyStruct *)malloc(sizeof(*ptr));
   ptr->i = 10;
   /*str is allocated dynamic memory*/
   ptr->str = malloc(10);

   strncpy(ptr->str,"Hello",6);

   printf("[%d]",ptr->i);
   printf("[%s]",ptr->str);


   /*Frees memory allocated to structure*/    
   /*But Oops you didn't free memory allocated to str*/
   /*Results in memory leak*/
   //free(ptr);

   /*Correct order of deallocation*/
   /*free member memory*/
   free(ptr->str);
   /*free structure memory*/
   free(ptr);


   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...