¿Cómo liberar () de forma correcta y segura toda la memoria usando una estructura anidada en C?

2
Natarich J 2019-07-05 07:19.

Tengo cuatro capas diferentes de estructura anidadas. El código es el siguiente:

typedef struct System system;  
typedef struct College college;
typedef struct Student student;
typedef struct Family family;

#define MAX_COLLEGES 10
#define MAX_NAME_LEN 32
#define MAX_STUDENTS 10

struct System {
    college *Colleges[MAX_COLLEGES];
};

struct College {
    char name[MAX_NAME_LEN];
    student *Students[MAX_STUDENTS];
};

struct Student {
    char name[MAX_NAME_LEN];
    int id;
    family *fam; //was typo familiy
};

struct Family {
    char fatherName[MAX_NAME_LEN];
    char motherName[MAX_NAME_LEN];
};

Y asigné memoria a todos ellos (no estoy seguro de si los asigné todos correctamente), de la siguiente manera:

system *collegeSys = malloc(sizeof(system));
college *colleges = malloc(sizeof(college));
student *students = malloc(sizeof(student));
family *fam = malloc(sizeof(family));

// then the following is initialization
...
...
...

Ahora, necesito eliminar la collegeSysestructura y cualquier cosa asociada con ella. Entonces, no sé si puedo liberar la primera collegeSysestructura sin liberar ninguna otra estructura, como esta:

free(collegeSys);

O para "eliminar cualquier cosa asociada con él", tengo que liberar todo de abajo hacia arriba, así:

free(fam);
free(students);
free(colleges);
free(collegeSys);

O con ese fin, incluso tengo que liberar todo lo que esté incluido dentro de cada estructura y liberarlo de abajo hacia arriba, así:

free (fam -> fatherName);
free (fam -> motherName);
free (fam);
free (students -> name);
free (students -> id);
free (students -> fam);
free (students)
.
. till
.
free (collegeSys -> colleges);
free (collegeSys);

¿Cuál es la forma correcta y segura de liberar la memoria? ¿O ninguno de ellos lo es?

2 answers

2
kiran Biradar 2019-07-05 14:32.

Realmente no entiendo el punto de tener una matriz de punteros, se podría hacer con puntero.

Definición:

struct System {
    college *Colleges;
};

struct College {
    char name[MAX_NAME_LEN];
    student *Students;
};

struct Student {
    char name[MAX_NAME_LEN];
    int id;
    familiy *fam;
};

struct Family {
    char fatherName[MAX_NAME_LEN];
    char motherName[MAX_NAME_LEN];
};

Asignación e inicialización:

system *collegeSys = malloc(sizeof(*collegeSys));
collegeSys->colleges = malloc(MAX_COLLEGES * sizeof(*(collegeSys->colleges)));
collegeSys->colleges->students = malloc(MAX_STUDENTS * sizeof(*(collegeSys->colleges->students)));
collegeSys->colleges->students->fam = malloc(sizeof(*(collegeSys->colleges->students->fam)));

Liberando:

free(collegeSys->colleges->students->fam);
free(collegeSys->colleges->students);
free(collegeSys->colleges);
free(collegeSys);

Actualizar:

Como si quisiera tener un estudiante estructurado A, B, C, D bajo una estructura universitaria

 collegeSys->colleges->students[0] = A;
 collegeSys->colleges->students[1] = B;
 collegeSys->colleges->students[2] = C;
 collegeSys->colleges->students[3] = D;

Deberías hacerlo.

Si tiene una matriz de students, puede usar memcpyo copiar loop.

struct student stud[MAX_STUDENTS] = {...};

memcpy(collegeSys->colleges->students[2], stud, MAX_STUDENTS);

o

for (int i = 0; i< MAX_STUDENTS; i++)
     collegeSys->colleges->students[i] = stud[i];

Nota:

Puede asignar la matriz a, collegeSys->colleges->studentsen ese caso, no necesita asignación de memoria dinámica o liberación.

 // collegeSys->colleges->students = malloc(MAX_STUDENTS * sizeof(*(collegeSys->colleges->students)));  //Leaks memory

 collegeSys->colleges->students = stud;

//free(collegeSys->colleges->students); //wrong
1
Kelvin 2019-07-05 17:40.

Cuando asigne una estructura, establezca todos los punteros en NULL. Por ejemplo, para asignar la estructura de su universidad, debe establecer todos los estudiantes en NULL:

struct College* CollegeAlloc( char name[MAX_NAME_LEN] ) {
    struct College* college = malloc( sizeof(struct College) );
    if ( college ) {
        for ( int i = 0; i < MAX_STUDENTS; ++i )
            college->Students[i] = NULL;
        memcpy( college->name, name, MAX_NAME_LEN );
    }
    return college;
}

Alternativamente, puede agregar un campo de recuento en las estructuras de cada matriz, para contar el número de elementos de la matriz que se utilizan realmente.

Si establece el elemento de la matriz en NULL cuando no se usa, puede liberarlo de abajo hacia arriba primero.

void FamilyFree( struct Family *fam ) {
    free( fam );
}
void StudentFree( struct Student *student ) {
    if ( student ) {
        FamilyFree( student->fam );
        free( student );
    }
}
void CollegeFree( struct College *college ) {
    if ( college ) {
        for ( int i = 0; i < MAX_STUDENTS; ++i )
            StudentFree( college->Students[i] );
        free( college );
    }
}
void SystemFree( struct System *sys ) {
    if ( sys ) {
        for ( int i = 0; i < MAX_COLLEGES; ++i )
            CollegeFree( sys->Colleges[i] );
        free( sys );
    }
}

Tenga en cuenta que esto supone que no se comparten sugerencias, por ejemplo, el mismo estudiante está en más de una universidad (cuando la implementación ha asignado solo una estructura para cada estudiante), o cuando hay dos hermanos que comparten la misma estructura familiar. (la estructura familiar no modela muy bien a las familias, por ejemplo, padres solteros, divorciados, vueltos a casar, padres homosexuales, tutores legales). Cuando las estructuras se pueden compartir, puede poner un recuento de referencia en la estructura y liberar solo cuando se reduzca a cero.

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Donald Trump acaba de despedir al director del FBI James Comey

Donald Trump acaba de despedir al director del FBI James Comey

Foto: AP El presidente Donald Trump acaba de despedir a James Comey, director del Buró Federal de Investigaciones. En un comunicado el martes, la Casa Blanca dijo que Trump había destituido a Comey de su cargo actuando “en base a las claras recomendaciones de ambos, el vicefiscal general Rod Rosenstein y el fiscal general Jeff Sessions.

La startup eléctrica NIO quiere vender un SUV de tres filas en China el próximo año

La startup eléctrica NIO quiere vender un SUV de tres filas en China el próximo año

Todas las fotos le dan crédito a NIO NIO, la startup de vehículos eléctricos respaldada por China conocida por su loca búsqueda para romper récords con su superdeportivo EP9, finalmente ha elaborado planes para un automóvil normal para la gente común. El NIO ES8 es un SUV eléctrico de tres filas exclusivo para el mercado chino con espacio para siete.

El LG G6 es demasiado simple

El LG G6 es demasiado simple

Todas las fotos: Alex Cranz / Gizmodo Es difícil destacar en el mundo de los teléfonos inteligentes, especialmente si su teléfono no hace nada único. LG lo sabe y nunca ha rehuido probar nuevas ideas.

La fuerza inicial es un increíble programa de entrenamiento con pesas para principiantes

La fuerza inicial es un increíble programa de entrenamiento con pesas para principiantes

Has escuchado que levantar pesas es bueno para ti y te hace más fuerte, más seguro y, en general, más malo. Pero tal vez no esté seguro de qué hacer.

Regala el 'mejor sueño de todos' con estos vaporizadores de ducha de eucalipto para el día de San Valentín

Regala el 'mejor sueño de todos' con estos vaporizadores de ducha de eucalipto para el día de San Valentín

Los vaporizadores de ducha de eucalipto BodyRestore tienen más de 11,000 calificaciones de cinco estrellas en Amazon. Ofrezca el producto de spa para el hogar como un regalo del Día de San Valentín para alguien que necesita disfrutar de un poco de cuidado personal.

Esta aspiradora de mano de $ 250 con 'Wicked Suction Power' ahora tiene un 75% de descuento en Amazon

Esta aspiradora de mano de $ 250 con 'Wicked Suction Power' ahora tiene un 75% de descuento en Amazon

Toneladas de compradores de Amazon recomiendan la aspiradora de mano Umlo H6, y está a la venta en este momento. El dispositivo de mano está equipado con un filtro HEPA y viene con varios accesorios. Compre la aspiradora de mano mientras tiene un 75 por ciento de descuento en Amazon

Octavia Spencer dice que la coprotagonista de 'The Help', Sissy Spacek, 'en realidad' la recordó después de hacer una pasantía en su película a los 17

Octavia Spencer dice que la coprotagonista de 'The Help', Sissy Spacek, 'en realidad' la recordó después de hacer una pasantía en su película a los 17

Octavia Spencer trabajó como pasante en la película de 1990 The Long Walk Home, protagonizada por Sissy Spacek, mucho antes de que coprotagonizaran The Help juntas.

Julia Fox se disculpa por no saber que 'Mascara' era el código de agresión sexual del usuario de TikTok

Julia Fox se disculpa por no saber que 'Mascara' era el código de agresión sexual del usuario de TikTok

"Realmente lo siento. Realmente estoy mostrando mi edad en este momento", dijo Julia Fox en un video de respuesta compartido en su TikTok.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Lo bueno y lo feo: 2022

Lo bueno y lo feo: 2022

ya no lo entiendo Parece casi imposible medir correctamente lo que es un "golpe".

Solo por diversión: las mejores reproducciones de música nueva de 2022

Solo por diversión: las mejores reproducciones de música nueva de 2022

¡Finalmente! Bienvenido a mis mejores reproducciones de música nueva de 2022. Comparto esto todos los años para conectarme con amigos.

el es todo lo que tengo

el es todo lo que tengo

Revisa tu corazón. Nuestros corazones a menudo se desvían.

Language