Allocation et libération de mémoire.
Résolu
CoDForlan
Messages postés
54
Statut
Membre
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
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:
- Allocation et libération de mémoire.
- Mémoire vive - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Comment liberer de l'espace sur gmail - Guide
- C'est un secret bien gardé : ce réglage d'expert peut doper les performances de votre PC - Guide
- Nettoyer memoire iphone - Guide
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 :
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".