Важно помнить следующее:
Динамическая память всегда выделяется, а также освобождается явно.
Каждый раз, когда вы выделяете память для указателя с помощью 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;
}