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)