Bonjour à tous
Pour tester un problème rencontré dans une de mes applis j'ai créé une autre petite appli et mis le code suivant exécuté dans un timer.
Il ne fait qu'allouer un grand nombre de pointeurs pour les libérer immédiatement mais présente le même problème rencontré dans lautre appli.
Voilà mon soucis:
J'affiche le gestionnaire de programme Windows et affiche les processus.
Si je ne touche à rien pendant le fonctionnement tout va bien :
Le programme alloue et libère bien la mémoire:
après le pic je retombe toujours sur la mémoire utilisée au démarrage...
Mais si je provoque des événements windows (ex: survol de la barre de tache, clic sur le menu démarrer, ouverture d'un dossier, déplacement d'une fenêtre)
mon programme se met à utiliser plus de mémoire : je ne retombe plus sur la valeur au démarrage (+4ko, +8ko et plus parfois)
A la longue ça finit par faire beaucoup

A quoi est-ce dù et quelqu'un a t'il déjà rencontré ce problème ?
Voilà le code de test (j'utilise C++ builder v 5)
"
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int iter=0;
static int nberr=0;
long *ordre;
char **listOfItem=0;
int nbelts = 1000000; //1 000 000 ouf!
int erreur = 0;
bool memok;
memok = true;
listOfItem = NULL;
ordre = NULL;
try
{
if (memok)
ordre = new long[nbelts ]; // max de nb éléments
memok = memok & (ordre != NULL);
if (memok)
listOfItem = new char*[nbelts ]; // max de nb éléments
memok = memok & (listOfItem != NULL);
if (memok)
{
//Affectation des pointeurs
for (int i=0; i<nbelts ; i++)
listOfItem[i] = NULL;
for (int i=0; i<nbelts; i++)
{
listOfItem[i] = new char[256];
if ( listOfItem[i] != NULL )
memset(listOfItem[i], 0, 256);
else
{
memok = false;
for (int i=i-1; i>=0; i--)
{
if (listOfItem[i] != NULL)
{
delete [] listOfItem[i];
listOfItem[i] = NULL;
}
}
if (listOfItem != NULL)
{
delete [] listOfItem;
listOfItem = NULL;
}
if (ordre != NULL)
{
delete [] ordre;
ordre = NULL;
}
nbelts = 0;
erreur = 1;
}
}
}
}
catch (Exception &exception)
{
memok = false;
}
//Libération des pointeurs
if (listOfItem != NULL)
{
for (int i=nbelts-1; i>=0; i--)
{
if (listOfItem[i] != NULL)
delete [] listOfItem[i];
}
delete [] listOfItem;
}
if (ordre != NULL)
delete [] ordre;
if (! memok)
nberr++;
iter++;
Edit1->Text = AnsiString(iter);
Edit2->Text = AnsiString(nberr);
}
"
Si quelqu'un peut éclairer ma lanterne.
D'avance Merci
PS: j'ai essayé de faire un "catch (std::bad_alloc &e)"
mais le compilo me dit que "bad_alloc" ne fait pas partie de std (???).
De toute façon quand l'exception se produit le programme ne libère pas la mémoire et se vautre lamentablement (ex: avec int nbelts = 10 000 000)
on crashe et fin du voyage (abnormal program termination)