Allocation et libération de mémoire.

Résolu
CoDForlan Messages postés 44 Date d'inscription mercredi 17 juin 2020 Statut Membre Dernière intervention 21 juin 2023 - 21 juin 2023 à 14:36
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 22 juin 2023 à 15:06

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.

A voir également:

1 réponse

CoDForlan Messages postés 44 Date d'inscription mercredi 17 juin 2020 Statut Membre Dernière intervention 21 juin 2023 1
21 juin 2023 à 16:46

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
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 22 juin 2023 à 15:07

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".

0