IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[SDL_Mixer] Problème pour libèrer la mémoire


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut [SDL_Mixer] Problème pour libèrer la mémoire
    Bonjour à vous tous.
    Je viens d'essayer de réaliser un bout de code pour faciliter l'utilisation de la bibliothèque SDL_mixer. L'objectif est de pouvoir charger, jouer et libérer un nombre plus ou moins important de sons (ou musique) avec l'aide de fonctions simples.
    Le problème est que je suis assez nouveau dans le domaine et encore plus dans l'utilisation cette bibliothèque.
    Lorsque je lance le programme, les sons se chargent, ils se jouent à tour de rôles mais, ils restent en mémoire alors que le programme demande leur libération.

    Comment puis-je résoudre ce soucis et comment puis-je améliorer aux maximum le code (le rendre vraiment bien et efficace, car je pense qu'actuellement, il n'est pas bon bien qu'il tourne à peu près ).

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <string>
    #include <iostream>
    #include <SDL/SDL_mixer.h>
    #include "sons.h"
     
    using namespace std;
     
    Mix_Music *musique = NULL; // La musique qui sera jouée
    Mix_Chunk *son[] = {NULL}; // Le(s) son(s) qui sera joué
    int *nombreSon = NULL;
     
    void jouerMusique(string nom)
    {
        size_t size = nom.size() + 1;
        char * buffer = new char[ size ];
        strncpy( buffer, nom.c_str(), size );
        musique = Mix_LoadMUS(buffer); //Charge le son a l'adresse indiquée
        delete [] buffer;
     
     
        if(musique == NULL)  //Vérifie si le son est ok.
        {
            cout << "Erreur lors du chargement du son";
        }
     
        Mix_PlayMusic(musique, -1); // on joue notre son qu'une seul fois.
    }
     
    void stopMusique()
    {
        Mix_HaltMusic();
        Mix_FreeMusic(musique);
    }
     
    /*
        initSons(char nom[][], int numSound)
     
    	Charger tout les sons
    	demandés.
    */
     
    void initSons(string *nom, int numSound, int numChannel)
    {
        int i = 0; //Pour le systeme de boucle
        nombreSon = &numSound;
        Mix_AllocateChannels(numChannel); //Nombre de channels
        size_t size = nom[i].size() + 1;
        while(i != numSound)
        {
            size = nom[i].size() + 1;
            char * buffer = new char[ size ];
            strncpy( buffer, nom[i].c_str(), size );
            son[i] = Mix_LoadWAV(buffer);
            cout << "Son:"<<i<<" - Nom:" <<buffer<<" - Nombre de canaux:"<<numChannel << "\n";
            delete [] buffer;
            i++;
        }
    }
     
    void jouerSon(int numSound) //Jouer le son numéro X
    {
        if(numSound > *nombreSon)
        {
            printf("Son inexistant!");
        }
        else
        {
            Mix_PlayChannel(-1, son[numSound], 0);
        }
    }
     
    void suppSons() //Supprime tout les sons charger ainsi que les channels disponibles
    {
        int i = NULL;
        Mix_AllocateChannels(0);
        while(i != *nombreSon)
        {
            Mix_FreeChunk(son[i]);
            i++;
        }
    }
    Et voici le résultat que renvoie Valgrind:
    ==5173== Memcheck, a memory error detector
    ==5173== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
    ==5173== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
    ==5173== Command: ./PSBG
    ==5173== Parent PID: 4440
    ==5173==
    ==5173== Conditional jump or move depends on uninitialised value(s)
    ==5173== at 0x4073E8: jouerSon(int) (sons.cpp:75)
    ==5173== by 0x407009: main (main.cpp:47)
    ==5173==
    ==5173== Conditional jump or move depends on uninitialised value(s)
    ==5173== at 0x407473: suppSons() (sons.cpp:89)
    ==5173== by 0x407018: main (main.cpp:49)
    ==5173==
    ==5173== Conditional jump or move depends on uninitialised value(s)
    ==5173== at 0x64C718C: MPEGaudio::Stop() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64C72A9: MPEGaudio::Rewind() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D93C6: MPEGaudio::initialize() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64C7628: MPEGaudio::MPEGaudio(MPEGstream*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64C0CCD: MPEG::parse_stream_list() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64C163A: MPEG::Init(SDL_RWops*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64C6D82: SMPEG_new (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x40A812: Mix_LoadMUS (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
    ==5173== by 0x4071DD: jouerMusique(std::string) (sons.cpp:30)
    ==5173== by 0x407051: main (main.cpp:51)
    ==5173==
    ==5173== Thread 3:
    ==5173== Conditional jump or move depends on uninitialised value(s)
    ==5173== at 0x64D5F46: MPEGaudio::layer3hybrid(int, int, float (*) [18], float (*) [32]) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D7D27: MPEGaudio::extractlayer3() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D90B4: MPEGaudio::run(int, double*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D91A1: Decode_MPEGaudio(void*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x4E3E3F4: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==5173== by 0x4E815F8: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==5173== by 0x5E4B970: start_thread (pthread_create.c:304)
    ==5173== by 0x5BA792C: clone (clone.S:112)
    ==5173==
    ==5173== Conditional jump or move depends on uninitialised value(s)
    ==5173== at 0x64D5F46: MPEGaudio::layer3hybrid(int, int, float (*) [18], float (*) [32]) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D7F26: MPEGaudio::extractlayer3() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D90B4: MPEGaudio::run(int, double*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x64D91A1: Decode_MPEGaudio(void*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==5173== by 0x4E3E3F4: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==5173== by 0x4E815F8: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==5173== by 0x5E4B970: start_thread (pthread_create.c:304)
    ==5173== by 0x5BA792C: clone (clone.S:112)
    ==5173==
    ==5173==
    ==5173== HEAP SUMMARY:
    ==5173== in use at exit: 16,055,011 bytes in 1,367 blocks
    ==5173== total heap usage: 15,134 allocs, 13,767 frees, 35,560,879 bytes allocated
    ==5173==
    ==5173== LEAK SUMMARY:
    ==5173== definitely lost: 26 bytes in 3 blocks
    ==5173== indirectly lost: 176 bytes in 4 blocks
    ==5173== possibly lost: 8,176 bytes in 1 blocks
    ==5173== still reachable: 16,046,633 bytes in 1,359 blocks
    ==5173== suppressed: 0 bytes in 0 blocks
    ==5173== Rerun with --leak-check=full to see details of leaked memory
    ==5173==
    ==5173== For counts of detected and suppressed errors, rerun with: -v
    ==5173== Use --track-origins=yes to see where uninitialised values come from
    ==5173== ERROR SUMMARY: 41 errors from 5 contexts (suppressed: 6 from 5)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    En regardant rapidement le code, je dois dire que je vois un problème de conception.
    Voyez, dans la fonction PlayMusique():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    strncpy( buffer, nom.c_str(), size );
        musique = Mix_LoadMUS(buffer); //Charge le son a l'adresse indiquée
        delete [] buffer;
    Il y a un Mix_LoadMUS() ... donc chargement dans une fonction qui joue. Donc cela veut dire que à chaque fois que je veux jouer une musique, j'en charge une O_o. C'est assez horrible, d'une part car cela ne permet pas d'avoir un chargement séparé (cas important dans les jeux, ou on charge tout au début, et après on utilise), et puis cela veut surement dire qu'il y a fuite, lorsque je joue deux musiques à la fois (bah oui ... le 'musique' n'est pas libéré correctement du coup).

    Sinon, avec Valgrind, il faut voir ce qu'il indique à la fin, afin d'ajouter les options qui faut pour voir les blocs de mémoire non désalloué (il y a un --show-reachable = yes et une autre (je ne retiens jamais, surtout qu'il nous le dit tout le temps ))
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Je pensais ne jouer qu'une seul musique à la fois dans le jeu, ou du moins une seul dans un niveau. Mais après réflexion, ajouter quelques lignes en plus ne peu pas faire de mal .

    Sinon, il me semble pour Valgrind que c'est --track-origins=yes (j'ai regardé en bas de celui que j'ai posté ), et voici le résultat:

    ==6990== Memcheck, a memory error detector
    ==6990== Copyright (C) 2002-2010, and GNU GPLd, by Julian Seward et al.
    ==6990== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
    ==6990== Command: ./PSBG
    ==6990== Parent PID: 2312
    ==6990==
    ==6990== Conditional jump or move depends on uninitialised value(s)
    ==6990== at 0x4073E8: jouerSon(int) (sons.cpp:75)
    ==6990== by 0x407009: main (main.cpp:47)
    ==6990== Uninitialised value was created by a stack allocation
    ==6990== at 0x4073CE: jouerSon(int) (sons.cpp:74)
    ==6990==
    ==6990== Conditional jump or move depends on uninitialised value(s)
    ==6990== at 0x407473: suppSons() (sons.cpp:89)
    ==6990== by 0x407018: main (main.cpp:49)
    ==6990== Uninitialised value was created by a stack allocation
    ==6990== at 0x407440: suppSons() (sons.cpp:89)
    ==6990==
    ==6990== Conditional jump or move depends on uninitialised value(s)
    ==6990== at 0x64C718C: MPEGaudio::Stop() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C72A9: MPEGaudio::Rewind() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D93C6: MPEGaudio::initialize() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C7628: MPEGaudio::MPEGaudio(MPEGstream*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C0CCD: MPEG::parse_stream_list() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C163A: MPEG::Init(SDL_RWops*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C6D82: SMPEG_new (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x40A812: Mix_LoadMUS (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
    ==6990== by 0x4071DD: jouerMusique(std::string) (sons.cpp:30)
    ==6990== by 0x407051: main (main.cpp:51)
    ==6990== Uninitialised value was created by a heap allocation
    ==6990== at 0x4C28973: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==6990== by 0x64C0CB4: MPEG::parse_stream_list() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C163A: MPEG::Init(SDL_RWops*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C6D82: SMPEG_new (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x40A812: Mix_LoadMUS (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
    ==6990== by 0x4071DD: jouerMusique(std::string) (sons.cpp:30)
    ==6990== by 0x407051: main (main.cpp:51)
    ==6990==
    ==6990== Thread 3:
    ==6990== Conditional jump or move depends on uninitialised value(s)
    ==6990== at 0x64D5F46: MPEGaudio::layer3hybrid(int, int, float (*) [18], float (*) [32]) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D7D27: MPEGaudio::extractlayer3() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D90B4: MPEGaudio::run(int, double*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D91A1: Decode_MPEGaudio(void*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x4E3E3F4: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==6990== by 0x4E815F8: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==6990== by 0x5E4B970: start_thread (pthread_create.c:304)
    ==6990== by 0x5BA792C: clone (clone.S:112)
    ==6990== Uninitialised value was created by a heap allocation
    ==6990== at 0x4C28973: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==6990== by 0x64C0CB4: MPEG::parse_stream_list() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C163A: MPEG::Init(SDL_RWops*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C6D82: SMPEG_new (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x40A812: Mix_LoadMUS (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
    ==6990== by 0x4071DD: jouerMusique(std::string) (sons.cpp:30)
    ==6990== by 0x407051: main (main.cpp:51)
    ==6990==
    ==6990== Conditional jump or move depends on uninitialised value(s)
    ==6990== at 0x64D5F46: MPEGaudio::layer3hybrid(int, int, float (*) [18], float (*) [32]) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D7F26: MPEGaudio::extractlayer3() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D90B4: MPEGaudio::run(int, double*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64D91A1: Decode_MPEGaudio(void*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x4E3E3F4: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==6990== by 0x4E815F8: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
    ==6990== by 0x5E4B970: start_thread (pthread_create.c:304)
    ==6990== by 0x5BA792C: clone (clone.S:112)
    ==6990== Uninitialised value was created by a heap allocation
    ==6990== at 0x4C28973: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==6990== by 0x64C0CB4: MPEG::parse_stream_list() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C163A: MPEG::Init(SDL_RWops*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x64C6D82: SMPEG_new (in /usr/lib/libsmpeg-0.4.so.0.1.4)
    ==6990== by 0x40A812: Mix_LoadMUS (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
    ==6990== by 0x4071DD: jouerMusique(std::string) (sons.cpp:30)
    ==6990== by 0x407051: main (main.cpp:51)
    ==6990==
    ==6990==
    ==6990== HEAP SUMMARY:
    ==6990== in use at exit: 16,055,011 bytes in 1,367 blocks
    ==6990== total heap usage: 15,225 allocs, 13,858 frees, 35,564,935 bytes allocated
    ==6990==
    ==6990== LEAK SUMMARY:
    ==6990== definitely lost: 26 bytes in 3 blocks
    ==6990== indirectly lost: 176 bytes in 4 blocks
    ==6990== possibly lost: 8,176 bytes in 1 blocks
    ==6990== still reachable: 16,046,633 bytes in 1,359 blocks
    ==6990== suppressed: 0 bytes in 0 blocks
    ==6990== Rerun with --leak-check=full to see details of leaked memory
    ==6990==
    ==6990== For counts of detected and suppressed errors, rerun with: -v
    ==6990== ERROR SUMMARY: 41 errors from 5 contexts (suppressed: 6 from 5)
    Bon, en attendant de trouver une solution, je vais arranger un peu la partie "musique" et créer un nouveau code mais pour les images. En tout cas, merci de m'aider.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    EN fait, actuellement il ne montre pas les fuites de mémoire, mais des erreurs liés à la mémoire (en fait, des conditions qui se basent sur des valeurs qui ne sont pas initialisés)
    Pour les corriger, souvent il faut juste initialisé la variable lors de sa définition. Malheureusement, cela ne semble pas venir toujours de votre code.


    Sinon, il faut au moins rajouter le -v et le -leak-check=full
    ==6990== Rerun with --leak-check=full to see details of leaked memory
    ==6990==
    ==6990== For counts of detected and suppressed errors, rerun with: -v
    Et une fois qu'il seront rajoutés, valgrind donnera une dernière indication avec un --show-reachable=yes
    (De mémoire)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Ok, après avoir un peu changé mon code que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #include <string>
    #include <iostream>
    #include <SDL/SDL_mixer.h>
    #include "sons.h"
     
    using namespace std;
     
    Mix_Music *musique = NULL;
    Mix_Chunk *son[] = {NULL};
    int *nombreSon = NULL;
     
    /*
    Nous allons commencer par le chargement
    de notre musique puis pouvoir la jouer
    et la libérer.
    */
     
    void initMusique(string nom) //On initialise notre musique
    {
        size_t size = nom.size() + 1;
        char * buffer = new char[ size ];
        strncpy( buffer, nom.c_str(), size );
        musique = Mix_LoadMUS(buffer); //Charge la musique à l'adresse indiquée
        delete [] buffer;
     
        if(musique == NULL)  //Vérifie si la musique est ok.
        {
            cout << "Erreur lors du chargement du son";
        }
    }
     
    void jouerMusique()
    {
        Mix_PlayMusic(musique, -1); // on joue notre musique qu'une seul fois.
    }
     
    void stopMusique()
    {
        Mix_HaltMusic();
        Mix_FreeMusic(musique);
    }
     
    /*
        initSons(char nom[][], int numSound)
     
    	Charger tout les sons
    	demandés.
    */
     
    void initSons(string *nom, int numSound, int numChannel) //numSound = Nombre de sons à charger / numChannel = Nombre de channel à activer
    {
        int i = 0; //Pour le systeme de boucle
        nombreSon = &numSound;
        Mix_AllocateChannels(numChannel); //Nombre de channels
        size_t size = nom[i].size() + 1;
        while(i != numSound)
        {
            size = nom[i].size() + 1;
            char * buffer = new char[ size ];
            strncpy( buffer, nom[i].c_str(), size );
            son[i] = Mix_LoadWAV(buffer);
            cout << "Son:"<<i<<" - Nom:" <<buffer<<" - Nombre de canaux:"<<numChannel << "\n";
            delete [] buffer;
            i++;
        }
    }
     
    void jouerSon(int numSound) //Jouer le son numéro X
    {
        if(numSound > *nombreSon)
        {
            printf("Son inexistant!");
        }
        else
        {
            Mix_PlayChannel(-1, son[numSound], 0);
        }
    }
     
    void suppSons() //Supprime tout les sons charger ainsi que les channels disponibles
    {
        int i = NULL;
        Mix_AllocateChannels(0);
        while(i != *nombreSon)
        {
            Mix_FreeChunk(son[i]);
            i++;
        }
    }
    Voila l'adresse (trop long pour être copié ici) du résultat de Valgrind :
    http://pastebin.com/7q3s4WjH

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Il est bien dommage que vous ne donniez pas le code entier (avec votre main) ... mais bon ... je vais utilisé ma boule de cristal (réparé à 10% donc il se peut qu'elle ne fonctionne pas vraiment bien)
    ==2274== 15,920,640 bytes in 1 blocks are still reachable in loss record 172 of 172
    ==2274== at 0x4C2815C: malloc (vg_replace_malloc.c:236)
    ==2274== by 0x408A1E: Mix_LoadWAV_RW (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
    ==2274== by 0x407332: initSons(std::string*, int, int) (sons.cpp:74)
    ==2274== by 0x406FFF: main (main.cpp:46)
    Lorsque je vois celq, j'ai l'impression que la fonction suppSons n'est pas appelé.
    Enfin, en parant du principe qu'elle effectue la même chose que initSons.
    La correction de ceci vous évitera la plus grosse fuite de mémoire :p déjà.

    Sinon, je sais que la SDL a des problème avec valgrind, notamment, la SDL semble fuire de la mémoire.
    Vérifiiez bien que vous appelez SDL_Quit().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Voici donc le main.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
    #include <SDL/SDL_mixer.h>
    #include "system/sons.h"
     
    using namespace std;
     
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL; // Le pointeur qui va stocker la surface de l'écran
        SDL_Init(SDL_INIT_VIDEO);
     
        if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 ) // Initialisation du son
        {
            exit(EXIT_FAILURE);
        }
     
        ecran = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE); // On tente d'ouvrir une fenêtre
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 230, 230, 230));
     
        if (ecran == NULL) // Si l'ouverture a échoué, on écrit l'erreur et on arrête
        {
            fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
        SDL_WM_SetCaption("Test sur le son", NULL);
        SDL_Flip(ecran);
     
        string mesSons[1];
        mesSons[0] = "test.ogg"; //Je charge ma liste de sons (plus tard, une boucle lira directement les lignes d'un fichier)
        initSons(mesSons,1,2); //J'envois ma liste, je définis le nombre de son et entre le nombre de channel disponilble
        jouerSon(0); //Je joue le son 0(premier)
        SDL_Delay(5000); // 5 Secondes
        suppSons(); //Je supprime les sons
        SDL_Delay(5000);
        initMusique("test.mp3"); // Je charge la musique
        jouerMusique(); //Je la joue
        SDL_Delay(5000);
        stopMusique(); //Je l'arrête et la supprime
     
        Mix_CloseAudio();
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Pourtant, je fais bien appel de cette fonction. Étrange!

    (Au cas ou, sons.h)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef SONS_H_INCLUDED
    #define SONS_H_INCLUDED
    using namespace std;
     
    void initMusique(string nom);
    void jouerMusique();
    void stopMusique();
    void initSons(string *nom, int numSound, int numChannel);
    void jouerSon(int numSound);
    void suppSons();
     
    #endif // SONS_H_INCLUDED

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Wouhou ma boule de cristal remarche un peu \o/
    Effectivement, vous n'avez pas appelé suppSons à la fin de votre main afin de libéré la mémoire prise par les sons.

    Par contre, je ne comprends pas pourquoi vous n'utilisez pas un joli design C++ avec une class, au lieu d'avoir des fonctions "libre" (sans classe).

    Cela vous aurez donné l'avantage du constructeur / destructeur, et dans le destructeur, on aurait mis la code de suppSons, et la déallocation serait automatique (ou presque).
    De plus, cela aurait évité les variables globales ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Mix_Music *musique = NULL;
    Mix_Chunk *son[] = {NULL};
    int *nombreSon = NULL;
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Effectivement, vous n'avez pas appelé suppSons à la fin de votre main afin de libéré la mémoire prise par les sons.
    Pas à la fin, mais juste après le SDL_Delay(5000);
    Pour que je puisse voir le chargement puis la "libération".

    Par contre, je ne comprends pas pourquoi vous n'utilisez pas un joli design C++ avec une class, au lieu d'avoir des fonctions "libre" (sans classe).
    Oui, j'avais commencé à écrire un code en C et non C++.
    Je devrai peut être en effet rechanger totalement le code.
    Je vais essayer ça, merci pour votre aide .

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Thedahu Voir le message
    Pas à la fin, mais juste après le SDL_Delay(5000);
    Pour que je puisse voir le chargement puis la "libération".
    Oops :s

    Déjà ... je me demande pourquoi cela est un pointeur:
    [codeint *nombreSon = NULL;[/code]
    Ce qui "provoque" ce code:
    Et puis ... ceci aussi est assez étrange:
    Le travail autour de cette chaine est aussi lourd sachant que std::string donne tout ce qu'il faut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strncpy( buffer, nom[i].c_str(), size );
            son[i] = Mix_LoadWAV(buffer);
            cout << "Son:"<<i<<" - Nom:" <<buffer<<" - Nombre de canaux:"<<numChannel << "\n";
            delete [] buffer;
    En fait ... c'est que je ne vois pas d'ou vient la fuite
    Mais d'un autre coté, il y a tellement de choses étonnante ... que ... c'est très dur de comprendre la vrai réaction du code
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Pour la chaine, je l'utilise pour convertir std::string en char* pour Mix_LoadMUS.

    Sinon j'ai viré le pointeur et arranger en Bilan, les sons courts sont enfin libérés! Houra!

    Reste encore la musique qui ne se libère toujours pas.

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Thedahu Voir le message
    Pour la chaine, je l'utilise pour convertir std::string en char* pour Mix_LoadMUS.

    Sinon j'ai viré le pointeur et arranger en Bilan, les sons courts sont enfin libérés! Houra!

    Reste encore la musique qui ne se libère toujours pas.
    Cette chaine me sert pour changer le string en char*.
    En fait, le strncpy est complètement inutile. Vous pouvez utiliser directement
    nom[i].c_str()
    et du coup, enlever le buffer.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    En effet, ça fait plus léger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #include <string>
    #include <iostream>
    #include <SDL/SDL.h>
    #include <SDL/SDL_mixer.h>
    #include "sons.h"
     
    using namespace std;
     
    Mix_Music *musique = NULL;
    Mix_Chunk *son[] = {NULL};
    int nombreSon=0;
     
    /*
    Nous allons commencer par le chargement
    de notre musique puis pouvoir la jouer
    et la libérer.
    */
     
    void initMusique(string nom) //On initialise notre musique
    {
        musique = Mix_LoadMUS(nom.c_str()); //Charge la musique à l'adresse indiquée
     
        if(musique == NULL)  //Vérifie si la musique est ok.
        {
            cout << "Erreur lors du chargement du son";
        }
    }
     
    void jouerMusique()
    {
        Mix_PlayMusic(musique, -1); // on joue notre musique
    }
     
    void stopMusique()
    {
        Mix_HaltMusic();
        Mix_FreeMusic(musique);
    }
     
    /*
        initSons(char nom[][], int numSound)
     
    	Charger tout les sons
    	demandés.
    */
     
    void initSons(string *nom, int numSound, int numChannel) //numSound = Nombre de sons à charger / numChannel = Nombre de channel à activer
    {
        int i = 0; //Pour le systeme de boucle
        nombreSon = numSound;
        Mix_AllocateChannels(numChannel); //Nombre de channels
        while(i != numSound)
        {
            son[i] = Mix_LoadWAV(nom[i].c_str());
            cout << "Son:"<<i<<" - Nom:" <<nom[i].c_str()<<" - Nombre de canaux:"<<numChannel << "\n";
            i++;
        }
    }
     
    void jouerSon(int numSound) //Jouer le son numéro X
    {
        if(numSound > nombreSon)
        {
            printf("Son inexistant!");
        }
        else
        {
            Mix_PlayChannel(-1, son[numSound], 0);
        }
    }
     
    void suppSons() //Supprime tout les sons charger ainsi que les channels disponibles
    {
        int i=0;
        Mix_AllocateChannels(0);
        while(i != nombreSon)
        {
            Mix_FreeChunk(son[i]);
            i++;
        }
    }

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Bon, j'ai essayé de retravailler mon code pour qu'il ait la tête d'un code C++.

    Donc les voici à nouveau :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
    #include <SDL/SDL_mixer.h>
    #include "system/Sons.h"
     
    using namespace std;
     
     
    int main(int argc, char *argv[])
    {
        //SDL_Surface *ecran = NULL; // Le pointeur qui va stocker la surface de l'écran
        //SDL_Init(SDL_INIT_VIDEO);
        Sons *mesSons = new Sons();
     
        if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 ) // Initialisation du son
        {
            exit(EXIT_FAILURE);
        }
     
        string listeSons[3];
        listeSons[0] = "a.ogg";
        listeSons[1] = "b.ogg"; //Je charge ma liste de sons (plus tard, une boucle lira directement les lignes d'un fichier)
        listeSons[2] = "c.ogg";
        mesSons->chargerSon(listeSons, 3, 3);
        SDL_Delay(5000);
        mesSons->jouerSon(0);
        SDL_Delay(5000);
        mesSons->jouerSon(1);
        SDL_Delay(5000);
        mesSons->jouerSon(3);
        SDL_Delay(5000);
        delete mesSons;
     
        Mix_CloseAudio();
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Sons.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #ifndef SONS_H
    #define SONS_H
     
     
    class Sons
    {
        public:
            Sons(); //Constructeur
            Sons(std::string *nom, int nbSons, int nbChan); // surchargé (Nom du son, nombres de sons, nombre de channel)
            void chargerSon(std::string *nom, int nbSons, int nbChan); //Charger les sons s'ils ne sont pas déjà charger
            void jouerSon(int numSon); // Jouer un son numSon
            ~Sons(); //Destructeur
     
        private:
        void loadSound(std::string *nom, int *nbSons, int *nbChan);
        void playSound(int *numberSound);
        void unloadSound();
     
        Mix_Chunk *m_sons[]; // Mes sons
        int m_nombreSon; // Nombre de sons
        int m_nombreChan; // Nombre de channels
     
    };
     
    #endif // SONS_H
    Sons.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <string>
    #include <iostream>
    #include <SDL/SDL_mixer.h>
    #include "Sons.h"
     
    using namespace std;
     
     
    /*
        _____________________________________PARTIE PUBLIQUE_____________________________________
    */
    Sons::Sons()
    {
        *m_sons = {NULL}; //Initialiser attributs
        m_nombreSon = 0;
        m_nombreChan = 0;
    }
     
     
    Sons::Sons(string *nom, int nbSons, int nbChan)
    {
        *m_sons = {NULL};
        loadSound(nom, &nbSons, &nbChan); //Directement charger les sons
    }
     
     
    void Sons::chargerSon(string *nom, int nbSons, int nbChan)
    {
        loadSound(nom, &nbSons, &nbChan); //Charger les sons
    }
     
    void Sons::jouerSon(int numSon)
    {
        playSound(&numSon); //Jouer le son numSon
    }
     
     
    Sons::~Sons()
    {
        unloadSound(); //libèrer son
        delete [] m_sons; //Supprimer m_sons
    }
     
    /*
        _____________________________________PARTIE PRIVEE_____________________________________
    */
     
    void Sons::loadSound(string *nom, int *nbSons, int *nbChan)
    {
        int i = 0; //Pour le systeme de boucle
        Mix_AllocateChannels(*nbChan); //Nombre de channels
        while(i != *nbSons)
        {
            m_sons[i] = Mix_LoadWAV(nom[i].c_str());
            cout << "Son:"<<i<<" - Nom:" <<nom[i].c_str()<<" - Nombre de canaux:"<<*nbChan << " - " << m_sons[i] << "- Numsound:" << *nbSons << "\n";
            i++;
        }
        m_nombreSon = *nbSons;
        m_nombreChan = *nbChan;
     
        cout << "Nombre de sons total:" << m_nombreSon << "\n";
    }
     
    void Sons::playSound(int *numberSound)
    {
        if(*numberSound > m_nombreSon)
        {
            cout << "Son inexistant!";
        }
        else
        {
            cout << "Jouer son num:" << *numberSound << "\n";
            Mix_PlayChannel(-1, m_sons[*numberSound], 0);
        }
    }
     
    void Sons::unloadSound()
    {
        int i=0;
        cout << "Nombre de sons à supprimer:" << m_nombreSon << "\n";
        while(i != m_nombreSon)
        {
            Mix_FreeChunk(m_sons[i]);
            cout << "Libere son:" << i << "\n";
            i++;
        }
        Mix_AllocateChannels(0);
    }
    Et enfin le résultat de valgrind :
    ==10123== Memcheck, a memory error detector
    ==10123== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
    ==10123== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
    ==10123== Command: ./Son_test
    ==10123== Parent PID: 10104
    ==10123==
    ==10123== Invalid write of size 8
    ==10123== at 0x406FD9: Sons::loadSound(std::string*, int*, int*) (Sons.cpp:54)
    ==10123== by 0x406ED9: Sons::chargerSon(std::string*, int, int) (Sons.cpp:29)
    ==10123== by 0x406C86: main (main.cpp:49)
    ==10123== Address 0x9f7e048 is 0 bytes after a block of size 8 alloc'd
    ==10123== at 0x4C28973: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==10123== by 0x406B63: main (main.cpp:27)
    ==10123==
    ==10123== Invalid read of size 8
    ==10123== at 0x406FED: Sons::loadSound(std::string*, int*, int*) (Sons.cpp:55)
    ==10123== by 0x406ED9: Sons::chargerSon(std::string*, int, int) (Sons.cpp:29)
    ==10123== by 0x406C86: main (main.cpp:49)
    ==10123== Address 0x9f7e048 is 0 bytes after a block of size 8 alloc'd
    ==10123== at 0x4C28973: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==10123== by 0x406B63: main (main.cpp:27)
    ==10123==
    ==10123== Invalid read of size 4
    ==10123== at 0x40877C: Mix_PlayChannelTimed (in /home/thedahu/C++/Son_test/bin/Debug/Son_test)
    ==10123== by 0x4071B1: Sons::playSound(int*) (Sons.cpp:73)
    ==10123== by 0x406F03: Sons::jouerSon(int) (Sons.cpp:34)
    ==10123== by 0x406CA1: main (main.cpp:51)
    ==10123== Address 0x300000013 is not stack'd, malloc'd or (recently) free'd
    ==10123==
    ==10123==
    ==10123== Process terminating with default action of signal 11 (SIGSEGV)
    ==10123== Access not within mapped region at address 0x300000013
    ==10123== at 0x40877C: Mix_PlayChannelTimed (in /home/thedahu/C++/Son_test/bin/Debug/Son_test)
    ==10123== by 0x4071B1: Sons::playSound(int*) (Sons.cpp:73)
    ==10123== by 0x406F03: Sons::jouerSon(int) (Sons.cpp:34)
    ==10123== by 0x406CA1: main (main.cpp:51)
    ==10123== If you believe this happened as a result of a stack
    ==10123== overflow in your program's main thread (unlikely but
    ==10123== possible), you can try to increase the size of the
    ==10123== main thread stack using the --main-stacksize= flag.
    ==10123== The main thread stack size used in this run was 8388608.
    ==10123==
    ==10123== HEAP SUMMARY:
    ==10123== in use at exit: 58,103,620 bytes in 243 blocks
    ==10123== total heap usage: 2,547 allocs, 2,304 frees, 117,286,551 bytes allocated
    ==10123==
    ==10123== LEAK SUMMARY:
    ==10123== definitely lost: 72 bytes in 3 blocks
    ==10123== indirectly lost: 42,043,104 bytes in 2 blocks
    ==10123== possibly lost: 15,921,034 bytes in 5 blocks
    ==10123== still reachable: 139,410 bytes in 233 blocks
    ==10123== suppressed: 0 bytes in 0 blocks
    ==10123== Rerun with --leak-check=full to see details of leaked memory
    ==10123==
    ==10123== For counts of detected and suppressed errors, rerun with: -v
    ==10123== ERROR SUMMARY: 5 errors from 3 contexts (suppressed: 4 from 4)
    Pas bon résultat , mais le code est plus jolie

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Mix_Chunk *m_sons[]; // Mes sons
    Pourquoi ne pas utiliser un std::vector ?

    Actuellement, je ne vois pas comment vous avez fait pour perdre encore plus de mémoire... je vais tester dans quelques temps ...

    Donc, j'arrive enfin à compiler.
    Êtes vous au courant que ceci:
    C'est du C++0x ... (bon ça marche mais bon)

    Si on suit votre principe, vous pouvez appeler un de vos constructeurs, ce qui vous évitera d'appeler chargerSons(). Mais je ne vois pas l'erreur ici.
    Par contre ... vous avez des erreurs, je crois ... avec la fonction loadSound() (on notera le mélange anglais / français dans les noms des fonctions).
    De plus dans la fonction loadSound(), vous demandez des pointeurs ... ce qui est inutile.

    Un pointeur sur un string, l'idée n'est pas mauvaise ... sauf que le mieux c'est de faire des références ... et encore mieux, à la place d'un tableau, utilisez un std::vector.

    Voilà le code est toujours à amélioré (j'imagine qu'avec des std::vector, on arrivera à un meilleur résultat)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Je perd un peu plus de mémoire car j'ai charger plusieurs sons au lieu d'un seul
    (3 exactement).
    Sinon, je vais tester le std::vector.



    Hum j'ai du mal à voir comment utiliser vector avec *m_sons.
    Sinon j'ai enlevé les pointeurs et utiliser vector pour le string.

Discussions similaires

  1. problème pour garder en mémoire un texte
    Par Basile le disciple dans le forum Débuter
    Réponses: 12
    Dernier message: 11/08/2013, 11h41
  2. SDL_mixer problème pour "coupler" les sons
    Par xoorus dans le forum SDL
    Réponses: 2
    Dernier message: 22/02/2012, 13h46
  3. Pb avec des fonctions pour libérer la mémoire
    Par Krisprolls31 dans le forum C
    Réponses: 3
    Dernier message: 26/08/2010, 14h14
  4. [MySQL] Problème pour garder en mémoire un item selectionné dans une liste déroulante
    Par car0line dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/04/2009, 14h26
  5. [JPanel] libérer la mémoire pour une nouvelle assignation
    Par DDNetweaver dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 12/08/2007, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo