Bonjour,

je vous explique mon problème, je dois reprendre un logiciel et y ajouter des fonctionnalités. J'ai voulu vérifier avec codeguard si le programme était safe au niveau des fuites mémoires et j'ai trouvé un problème dans la fonction suivante :

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
 
AnsiString * Hdw_CBaseFile::split(AnsiString chaine,unsigned char separateur, unsigned int * taille)
{
        /*  On compte les séparateurs */
        int nbSep = 0;
        for(int i=1;i<=chaine.Length();i++)
                if(chaine[i]==separateur)
                        nbSep++;
 
        /** On créé le tableau de la taille appropriée */
        (*taille) = nbSep+1;
        AnsiString * result = new AnsiString[(*taille)];
 
 
        /** On récupère les différentes sous-chaines */
        int index = 0;
        AnsiString temp = "";
        for(int i=1;i<=chaine.Length();i++)
                if(chaine[i]==separateur)
                {
                        result[index] = temp;
                        temp = "";
                        index++;
                }
                else
                        temp += chaine.SubString(i,1);
 
        result[index] = temp;
        return result;
 
}
C'est ce
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 new AnsiString[(*taille)];
qui pose problème mais je ne vois pas comment supprimer ce tableau car la zone mémoire est utilisée par une autre fonction avec
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
short int Hdw_CCsvDBFile::readData( Hdw_SCsvDBData * data, unsigned int index )
{
        AnsiString temp;
        if( (temp=pFile->ReadString("Files",(AnsiString)index,"x"))=="x") return ERROR_READ_CSVDB_DATA;
 
        unsigned int nbDonnees;
        AnsiString * donnees = split(temp,';',&nbDonnees);
 
        if( nbDonnees<6 )
                return ERROR_READ_CSVDB_DATA;
 
        try
        {
                data->Fichier = donnees[1];
                data->Description = donnees[2];
                data->Type = donnees[3].ToInt();
                data->Firmware = donnees[4].ToInt();
                data->Categorie = donnees[5].ToInt();
        }
        catch(Exception & ex)
        {
                return ERROR_READ_CSVDB_DATA;
        }
        return RESULT_OK;
}
j'ai essayé pas mal de choses et je ne vois pas comment éviter cette fuite...

Je suis ouvert à toutes vos remarques !!