Resource leak avec CodeGuard
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:
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:
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:
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 !!