Bonjour, j'ai crée un programme qui utilise des allocation de mémoire avec new char[] et delete mais je n'ai pas trop l'impression qui libert la mémoire. J'aimerai bien savoir comment ce marche exactement !!
Comme le programme est assé conséquant 800 lignes(sans les commentaires ) je ne vai pas le mettre sur le forum mais si qq un veux voir le code ce ne me dérange pas. je vai quand même mettre la parti qui utilise beaucoup de mémoire.

C'est un algo de décodage de fichier compresser si vous voulez en savoir plus sur les méthode n'hésité pas.
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
DWORD WINAPI ThreadDecompression (LPVOID)
{
    MSG syn; // Variable message pour la syncronisation du thread
    SetWindowText(LogHwnd,"Decompression"); // LogHwnd est un champ de texte
    
    LireBinaire b; // un class qui gére les fichier a ma place
    b.Ouvrir(OSFile.Path,GENERIC_READ, OPEN_EXISTING );// ouverture du fichier
    if (b.Bon())
    {
        int Lettres;
        int longeur;
        int finalisation=0;
        char* buffer ;
        Lettres=b.LireChaineBinaire(0,9);         
        buffer = IntToChar(Lettres);                 // nombre de lettre codé
        AddTextEdit(LogHwnd,buffer,"\r\nLettres : ");
        delete buffer;
        
        longeur=b.LireChaineBinaire(9,14);
        buffer = IntToChar(longeur);                 // longeur de la longeur de bit qui contient la longeur du code
        AddTextEdit(LogHwnd,buffer,"\r\nLongeur ecriture : ");
        int alloc=puissance(longeur,2);
        delete buffer;
        
        buffer = IntToChar(alloc-1);                    // aproximation de la longeur max d'un code
        AddTextEdit(LogHwnd,buffer,"\r\nLongeur maximal : ");
        delete buffer;
        
        finalisation=b.LireChaineBinaire(14,17);
        buffer = IntToChar(finalisation);               // bits pour faut un fichier en octet
        AddTextEdit(LogHwnd,buffer,"\r\nFinalisation : ");
        delete buffer;
        
        SendDlgItemMessage(CompDlg, ID_PROGBAR , PBM_SETRANGE, 0, MAKELONG(0,Lettres));
        SendDlgItemMessage(CompDlg, ID_PROGBAR, PBM_SETSTEP, 1, 0);      // progress bar d'avancement
        int PosBinFi=17;
        int ITemp=0;
        map<char,char*> Convention;
        buffer = new char&#91;alloc*2&#93;;
        /*  Lecture de la convention de fichier  */
        for&#40;int y=0;y<Lettres;y++&#41;
        &#123; 
            buffer&#91;0&#93;=b.LireChaineBinaire&#40;PosBinFi,PosBinFi+8&#41;;
            buffer&#91;1&#93;=0;
            PosBinFi+=8;
            ITemp=b.LireChaineBinaire&#40;PosBinFi,PosBinFi+longeur&#41;;
            PosBinFi+=longeur;
            b.LireChaineBinaire&#40;PosBinFi,PosBinFi+ITemp&#41;;
            PosBinFi+=ITemp;
            Convention&#91;buffer&#91;0&#93;&#93;=new char&#91;ITemp+2&#93;;
            strcpy&#40;Convention&#91;buffer&#91;0&#93;&#93;,b.ChaineBits&#41;;
            strcat&#40;buffer," &#58; "&#41;;
            strcat&#40;buffer,b.ChaineBits&#41;;
            AddTextEdit&#40;LogHwnd,buffer,"\r\n"&#41;;
            SendDlgItemMessage&#40;CompDlg, ID_PROGBAR, PBM_STEPIT, 0, 0&#41;;
        &#125;
        delete buffer;
        /*      fin de lecture de convention      */
        AddTextEdit&#40;LogHwnd,"Décodage du fichier ...","\r\n"&#41;;
        SendDlgItemMessage&#40;CompDlg, ID_PROGBAR , PBM_SETRANGE, 0, MAKELONG&#40;0,100&#41;&#41;;
        SendDlgItemMessage&#40;CompDlg, ID_PROGBAR, PBM_SETSTEP, 1, 0&#41;;
        char FT&#91;MAX_PATH&#93;; 
        CharSetPathApp&#40;FT&#41;;         // fichier temp
        strcat&#40;FT,"DTemp.txt"&#41;;
        FichierEcrire FiTemp;
        FiTemp.Ouvrir&#40;FT,GENERIC_WRITE,CREATE_ALWAYS&#41;;
        buffer = new char&#91;alloc+1&#93;;
        ITemp=0;
        char Text&#91;100&#93;;
        int PosChaiBinCur,PosChaiBinLast;
        int PosChaiTex=0;
        int LastBarSet=-1;
        map<char,char*>&#58;&#58;const_iterator x;
        int FinFiBin = b.ObtenirTaille&#40;&#41;*8 - finalisation ; 
        // boucle de décodage
        while&#40;PosBinFi<=FinFiBin&#41;
        &#123;
            b.LireChaineBinaire&#40;PosBinFi,PosBinFi+1024&#41;;
            PosChaiBinCur=0;
            ITemp=0;
            while&#40;PosChaiBinCur<b.NBits&#41;
            &#123;
                buffer&#91;ITemp&#93;=b.ChaineBits&#91;PosChaiBinCur&#93;;
                buffer&#91;ITemp+1&#93;=0;
                ITemp++;
                PosChaiBinCur++; 
                // recherche dans le convention si le code existe
                for&#40;x=Convention.begin&#40;&#41;;x!=Convention.end&#40;&#41;;x++&#41;
                &#123;
                    if&#40;CharEgales&#40;buffer,x->second&#41;&#41;
                    &#123;
                        if &#40;PosChaiTex==99&#41;
                        &#123;                           
                           FiTemp.EcrireChaine&#40;Text,PosChaiTex&#41;;
                           PosChaiTex=0;
                        &#125;
                        Text&#91;PosChaiTex&#93;=x->first;
                        Text&#91;PosChaiTex+1&#93;=0;
                        PosChaiTex++;
                        ITemp=0;
                        PosChaiBinLast=PosChaiBinCur;
                    &#125;
                &#125;
                 // si on est a la fin on quitte
                if &#40;PosBinFi+PosChaiBinCur>FinFiBin&#41;
                   break; 
            &#125;
            PosBinFi+=PosChaiBinLast;
            if &#40;LastBarSet<&#40;PosBinFi&#41;*100/FinFiBin&#41;
            &#123;
               SendDlgItemMessage&#40;CompDlg, ID_PROGBAR, PBM_SETPOS,&#40;PosBinFi&#41;*100/FinFiBin, 0&#41;;
               LastBarSet=&#40;PosBinFi&#41;*100/FinFiBin;
               // si on appui sur annuler le thread s'arret
               PeekMessage&#40;&syn,NULL,0,0,0&#41;;
               if &#40;syn.message==TSM_STOP_THREAD&#41;
               &#123; 
                    AddTextEdit&#40;LogHwnd,"Arret"," "&#41;;
                    SendMessage&#40;CompDlg,TSM_THREAD_STOPPER,0,0&#41;;
                    return 0;
               &#125;
            &#125;
                
                
            if &#40;PosBinFi+1>FinFiBin&#41;
                   break;
            
            
        &#125; 
        FiTemp.EcrireChaine&#40;Text,PosChaiTex&#41;;
        FiTemp.Fermer&#40;&#41;;
        AddTextEdit&#40;LogHwnd,"Terminer.."," "&#41;;
        b.Fermer&#40;&#41;;
        b.Ouvrir&#40;FT,GENERIC_READ, OPEN_EXISTING &#41;; // chargement du fichier temp
        if &#40;b.Bon&#40;&#41;&#41;
        &#123;
            b.LireChaine&#40;0,-1&#41;;
            b.Chaine&#91;b.Retour&#40;&#41;&#93;=0;
            SetNullChar&#40;b.Chaine,b.Retour&#40;&#41;-1&#41;;
            SetWindowText&#40;EditHwnd,b.Chaine&#41;;
        &#125;
        else
        &#123;
            SetWindowText&#40;EditHwnd,"Erreur  a l'ouverture de"&#41;;
            AddTextEdit&#40;EditHwnd,FT," "&#41;;
        &#125;
    &#125;
    else
        AddTextEdit&#40;LogHwnd,"Le fichier ne peut pas étre ouvert !","\r\n"&#41;;
    b.Fermer&#40;&#41;;
    SendMessage&#40;CompDlg,TSM_THREAD_END,0,0&#41;;
    return 1;
&#125;
Merci si vous avez regardez car c'est pas évidant de comprendre le code de l'autre