Allocation et libération de mémoire.

Résolu

Bonjour, je suis en train de faire un programme concernant le poker. J'ai créé une fonction dans laquelle j'alloue 52 struct card, comme indiqué ci-dessous :

struct card{
    int value;
    char suit;
    int already_taken;
};
struct card* create_deck(){
    struct card* deck = (struct card*)malloc(52 * sizeof(struct card));
    if(!deck){
        return NULL;
    }

    // initialize the cards
    for (int i = 0; i < 52; i++) {
        deck[i].value = (i % 13) + 2;
        deck[i].already_taken = 0;
        if (i < 13)
            deck[i].suit = 'C'; // carreaux
        else if (i < 26)
            deck[i].suit = 'T'; // trefles
        else if (i < 39)
            deck[i].suit = 'H'; // coeurs
        else 
            deck[i].suit = 'P'; // pique
    }
    return deck;
}

dans le main:

int main(){
struct card* deck52 = (struct card*)malloc(52 * sizeof(struct card));
    if(!deck52){
        return -1;
    }
    deck52 = create_deck();

    //code...
    free(deck52);
    return 0;
}

Ensuite, j'ai analysé avec l'outil Dr. Memory pour vérifier s'il y avait des fuites, et il y a bel et bien des fuites de mémoire dans la fonction create_deck. Cependant, je ne vois pas où je devrais placer mon free(deck).

Si quelqu'un pourrait m'éclairer, merci pour vos futures réponses. Genoce.

1 réponse

  1. Problème résolu !

    l'erreur vien de la:
     

    struct card* deck52 = (struct card*)malloc(52 * sizeof(struct card));
        if(!deck52){
            return -1;
        }
        deck52 = create_deck();

    il faut écrire:

    struct card* deck52 = create_deck();
        if(!deck52){
            return -1;
        }
    1. Contributeur

      Salut  CoDForlan,

      Effectivement ton code écrasait le pointeur vers de la mémoire déjà allouée.

      Une observation sur ta structure de données pour créer ton paquet de cartes :

      struct card{
          int value;
          char suit;
          int already_taken;
      };

      Si already_taken sert à déterminer si la carte a déjà été piochée, je ne ferais pas cela et je retirerais ce champ de la struct.

      Tu peux simplement :

      • allouer la mémoire pour tes cartes et les créer dans l'ordre (tu disposes d'un paquet neuf)
      • mélanger tes cartes (avec un mélange de Fisher-Yates par exemple)
      • piocher dans le paquet en commençant par la première qui est à l'indice 0 de ton tableau de cartes

      Pour piocher les suivantes, tu incrémentes l'indice à mesure que tu prends des cartes.

      Tu dois donc seulement garder trace de l'indice de la carte qui correspond à celle qui est "au dessus du paquet".