es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo liberar esta matriz 2D calloc en C?

Estoy haciendo una tarea para mi clase de algoritmos en C y tengo una asignación de memoria de la siguiente manera:

Graph* new_graph = (Graph*)malloc(sizeof(Graph));
new_graph->adjacency_matrix = malloc(num_nodes*sizeof(int*));
for(int i = 0; i < num_nodes; i++) {
    for(int j = 0; j < num_nodes; j++) {
        new_graph->adjacency_matrix[i] = calloc(sizeof(int), num_nodes);
    }
}

Cuando intento liberar la memoria lo estoy haciendo de la siguiente manera, pero valgrind sigue informando que he perdido 1.176 bytes en 42 bloques debido a mi calloc.

void delete_graph(Graph *g) {
    for(int i = 0; i < g->num_vertices; i++) {
        free(g->adjacency_matrix[i]);
    }
    free(g->adjacency_matrix);
    free(g);
}

El tamaño de num_nodes es 7, así que asumo que solo se está liberando la primera fila o algo así, pero he intentado liberarlo con otro bucle for, etc., pero sigo teniendo los mismos errores. Realmente agradecería cualquier ayuda con esto. ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que en el código de asignación de memoria, se llama a la función calloc dentro del ciclo interno en lugar de fuera de él. Esto significa que para cada valor de i, se llama a calloc num_nodes veces, lo que es innecesario e incorrecto. En su lugar, la función calloc debe estar fuera del ciclo interno para que solo se llame una vez para cada valor de i.

    Aquí está el código corregido para la asignación de memoria:

    Graph* new_graph = (Graph*)malloc(sizeof(Graph));
    new_graph->adjacency_matrix = malloc(num_nodes*sizeof(int*));
    for(int i = 0; i < num_nodes; i++) {
        new_graph->adjacency_matrix[i] = calloc(sizeof(int), num_nodes);
    }
    

    En cuanto al código de eliminación, parece correcto. Sin embargo, es posible que haya código en otro lugar que no libere la memoria adecuadamente. Asegúrese de que se libere toda la memoria asignada con malloc/calloc en algún momento del código.

    Si el problema persiste, intente usar un perfilador de memoria como Valgrind para localizar el lugar exacto de la fuga de memoria.

Comments are closed.