Allocation et libération de mémoire.
Résolu[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
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
-
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; }-
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".
-