Mes 5 lignes de code bouffent de la mémoire
Salut,
Voila, je suis entrain de developper un petit logiciel de gestion de stock, normalment tout se déroule très bien, sauf voila, je remarque que ce logiciel bouf de plus en plus de mémoire, et ça pendant l'execution, Et ça malgrès que je suis très strict avec les new et delete.
J'ai utilisé CodeGuard, apparament tout marche bien comme je l'ai dis :mouarf:.
Voila, après certain éliminations, je croi que j'ai tronqué un morceau du code qui boufe et augmente l'occupation de la mémoire :
Code:
1 2 3 4 5 6 7 8 9 10
|
void __fastcall QueryExecute(TQuery *Query,AnsiString Requete)
{
Query->Close();
Query->SQL->Clear();
Query->SQL->Add(Requete);
Query->ExecSQL();
Query->Active=true;
} |
Vois l'aurez compri, c'est une fonction qui me permet d'executer certains type de requêtes SQL, et d'en tirer les resultats !
Pour enlever le doute, j'ai créer un nouveau projet qui utilise presque exclusivement cette fonction, autrement dit : une fiche, un Query1 et un Bouton qui fait :
Code:
1 2
|
QueryExecute(Query1,"Select* FROM BDDs\\Produits.db"); |
A chaque fois que je clique sur le bouton je remarque l'augmentation de la mémoire, à peut prêt 80 à 120 Ko, malgrès qu'il affiche le même resultat(puisque la même requête), et à chaque fois je ferme le Query1 (je pense que ça devrai libérer la mémoire allouée pour contenir les information des enregistrement! !?).
Le pire, quand j'ai placé un Timer qui fait le même travail que le bouton à un interval de 500ms, lol, il arrive jusqu'à ~32Mo alors qu'au début ne faisait à peinne 8Mo 8O, et la j'aurai une belle violation "Insufisant memory for this operation...". Donc la, ça devient serieux, je veux pas que l'utilisateur final de mon logiciel aura une violation qui fait planter le tout :?
Malgrès que j'ai modifié le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
void __fastcall QueryExecute(TQuery *Query,AnsiString Requete)
{
try
{
Query->Close();
Query->SQL->Clear();
Query->SQL->Add(Requete);
Query->ExecSQL();
Query->Active=true;
}
catch(...)
{
ShowMessage("Nous vous en fait pas, c'est juste une petite erreur, ça va marcher :)");
}
} |
Dès le premier catch, on peu plus ré-executer la requête, çàd que j'aurai toujours mon message du catch !
Mes questions si vous le permettez :
1- Esque c'est normal cette augmentation ?
2- Si oui, es qu'il y a pas une solution pour la libérer cette mémoire explicitement ?
3- Y aurai pas une autre solution pour accéder à mes enregistrement à partir d'une requête (On sait jamais...) ?
4- Si y a pas d'autre(s) solution(s), esqu'il y a pas moyen d'augmenter un peu la taille de mémoire que peut utiliser mon soft :lol: ?
Informations sur ma machine :
OS : WinXP Professionnel SP2
IDE : BCB6
RAM : SDRAM 256Mo
CPU : 1.7GHz
Progarmmeur : 8O
Merci d'avance pour votre aide ;)
A+