2016-06-30 12 views
0

C noob hier. Ich habe ein Programm erstellt, das ein Fußballteam simuliert, um mir bei der Speicherzuweisung zu helfen. Mein Programm funktioniert, aber valgrind sagt mir, dass ich ein Speicherleck in dem Verfahren „create_player“ habe und „add_player_to_club“Speicherleck erhalten, aber zugewiesener Speicher wurde freigegeben

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

#define SIZE 8 

typedef struct player { 
    int id; 
    char *position; 
} Player; 

typedef struct club { 
    int size; 
    Player *team[SIZE]; 
} Club; 


Player *create_player(int id, const char *description); 
void create_team(Club *club); 
void print_club(const Club *club); 
void destroy_player(Player *player); 
void add_player_to_club(Club *club, int id, const char *position); 
void destroy_club(Club *club); 

int main() { 
    Club club; 

    create_team(&club); 
    add_player_to_club(&club, 1, "forward"); 
    add_player_to_club(&club, 2, "goalie"); 
    print_club(&club); 
    destroy_club(&club); 

    return 0; 
} 

Player *create_player(int id, const char *description){ 

    Player *player; 

    player = malloc(sizeof(Player)); 

    if(description == NULL){ 
     player->position = NULL; 

    } else { 
     player->position = malloc(strlen(description) + 1); 
     strcpy(player->position, description); 
     player->id = id; 
    } 
    return player; 
} 
void destroy_player(Player *player){ 

    if (player == NULL){ 
     return; 
    } else { 
     free(player->position); 
     free(player); 
    } 
} 


void create_team(Club *team){ 

    team->size = 0; 

} 
void print_club(const Club *club) { 

    int i = 0; 

    if (club == NULL) { 
     return; 
    } else if (club->size == 0) { 
     printf("No team members\n"); 
    } else { 
     for (i = 0; i < club->size; i++) { 
      printf("Id: %d Position: %s\n", club->team[i]->id, 
        club->team[i]->position); 
     } 
    } 
} 
void add_player_to_club(Club *club, int id, const char *position){ 


    if (club == NULL || club->size >= SIZE) { 
     return; 
    } else { 
     club->team[club->size] = create_player(id, position); 
     club->size++; 

    } 
} 
void destroy_club(Club *club){ 

    int i = 0; 

    if (club == NULL) { 
     return; 
    } else { 
     club->size = 0; 

     for (i = 0; i < club->size; i++) { 

      destroy_player(club->team[i]); 
     } 
    } 
} 

Ich denke, das Problem mit meiner „zerstören Club“ Methode sein könnte. Player- "Objekte" werden im "Team" -Array gespeichert. Ich habe Speicher für jedes Spielerobjekt zugewiesen und die Zuweisung aufgehoben, indem ich durch das Team-Array iteriert habe und jeden Index freigegeben habe. Was habe ich vermasselt?

+3

'Club-> size = 0; für (i = 0; i < club-> Größe; i ++) {'Was? – EOF

+0

Follow-up von [dies] (http://stackoverflow.com/questions/38126544/printing-fields-of-structure-in-c-dynamic-memory-allocation) –

Antwort

2

In destroy_club, setzen Sie size auf 0, dann verwenden Sie das, um durch die Spieler zu durchlaufen, so dass es nichts durchläuft.

Set size-0 nach die Spieler Reinigung:

for (i = 0; i < club->size; i++) { 

     destroy_player(club->team[i]); 
    } 

    club->size = 0; 
Verwandte Themen