Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3770 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  débordement mémoire!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

débordement mémoire!

n°1134354
zied3
Posté le 29-06-2005 à 09:38:14  profilanswer
 

Bonjour,
j'ai un (gros) code développé en C++ (6.0), la version release ne marche pas alors que la version debug marche normallement. Je suis arriver à situer le pb  (même si je sais que c'est pas la réelle source du pb) en une fonction: en fait cette fonction n'est pas appelée  lors de l'éxectuion, mais si je la mets en commentaire la version release fonctionne (alors que je repéte qu'elle n'est pas appelée dans ce cas d'éxecution), et si je remets son code l'éxecution se plante.
J'ai bien fait attention à faire autant de malloc que de free et de delete que de new (même si dans ce cas c'est génerallement dans le destructeur donc ils ne sont pas encore appelés lors du plantage de l 'exec).

mood
Publicité
Posté le 29-06-2005 à 09:38:14  profilanswer
 

n°1134356
TotalRecal​l
Posté le 29-06-2005 à 09:39:34  profilanswer
 

marrant ça...
tu compiles en quoi ? (parametres)
on pourrait avoir un peu de code :??:

n°1134380
zied3
Posté le 29-06-2005 à 09:53:45  profilanswer
 

Non je n'ai aucun paramètre à passer, c'est une application MFC.
Pour le code c'est vraiment trop compliqué, en plus je ne crois pas que c'est cette fonction en question qui est la cause du pb, c'est les appels aux fonction précedentes, pourtant j'ai essayé de nettoyer avant cet appel.
De toute façon si ça peut t aider, voici la fonction qui foire tout:
 
Debug(std::string text)
{
 
 SE_Logs * newlog = new SE_Logs(_T("DBUG" ),CString(text.c_str()),CTime::GetCurrentTime()) ;
 logs.push_back(*newlog);
 Logfile = GetFile(this->GetPathName(),CFile::modeReadWrite|CFile::shareDenyNone ,NULL);
 if(Logfile == NULL) return OK_SE;
 Logfile->SeekToEnd();
 CString rString;
 newlog->FormatLogItem(rString);
 Logfile->Write(rString,rString.GetLength());
 Logfile->Flush();
 Logfile->Close();  
 UpdateAllViews(NULL, ID_ADD_LOG, (CObject*) newlog) ;
 delete newlog;
 return (se_code_t) OK_SE;
}

n°1134383
zied3
Posté le 29-06-2005 à 09:54:55  profilanswer
 

C'est le pushback qui foire plus exactement

n°1134437
HelloWorld
Salut tout le monde!
Posté le 29-06-2005 à 10:24:38  profilanswer
 

Donc le constructeur par recopie de SE_Logs à première vue.
Pourquoi tu fais une alloc dynamique dans ton code  
VC++ 6 renvoie NULL si l'alloc échoue il me semble, faudrait tester... et y'a une fuite si Logfile == NULL, ou si une exception est levée avant le delete...
Gérer la mémoire c'est complexe, utilise des smart ptr ou bien ici par exemple alloue l'objet sur la pile.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1134455
zied3
Posté le 29-06-2005 à 10:35:27  profilanswer
 

Salut HelloWorld,  
c'est surement très interessant ce que tu dis mais malheureusement je ne comprends pas:) Comment je fais pour allouer l objet sur la pile.
Et je fais une allocation dynamique pour chaque nouveau message à logger, je vais essayer de déclarer une variable golabale et changer son contenu à chaque fois.  
Mais comme je te l'ai dit cette fonction n'est pas appelée, est ce que tu penses que c'est réellement de là qu'est le pb?

n°1134464
HelloWorld
Salut tout le monde!
Posté le 29-06-2005 à 10:46:31  profilanswer
 

Ben tu dis que ça plante au push_back et que c'est pas appelé :??:
Pour allouer sur la pilen remplace

Code :
  1. SE_Logs * newlog = new SE_Logs(_T("DBUG" ),CString(text.c_str()),CTime::GetCurrentTime()) ;


par

Code :
  1. SE_Logs newlog(_T("DBUG" ),CString(text.c_str()),CTime::GetCurrentTime()) ;


plus besoin du delete.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1134470
zied3
Posté le 29-06-2005 à 10:56:57  profilanswer
 

En fait je crois que je viens de résoudre le pb:comme j'ai dit cette fonction n'est pas appelé lors de mon exceution, en fait dans le code c'est cainsi: "
if(COnditionSatisfaite) then logger->Debug("Trace" )  
"
or la condition n'est pas satisfaite donc il n entre pas, mais je viens de remarquer que "logger" pointe sur NULL donc peut être que lors du chargement du code dans la pile, y a une mauvaise utilisation de la mémoire.
En tout cas ça marche mtn, mais je vais faire de nouveaux tests pour pouvoir confirmer ça.
En tout cas merci à tout le monde et je vous tiens au courant.

n°1134527
slash33
Posté le 29-06-2005 à 11:37:00  profilanswer
 

Ca vous arrive de faire un contrôle de pré-condition avec ASSERT??

n°1134529
zied3
Posté le 29-06-2005 à 11:38:22  profilanswer
 

Je vais y penser désormais

mood
Publicité
Posté le 29-06-2005 à 11:38:22  profilanswer
 

n°1134530
Taz
bisounours-codeur
Posté le 29-06-2005 à 11:38:41  profilanswer
 

mais juste comme ça sur c'est conneries de VS 6, il renvoie 0 que vous désactivez les exceptions ou tout le temps ?

n°1134583
slash33
Posté le 29-06-2005 à 12:25:18  profilanswer
 

Désolé comprend pas ce que vous voulez dire ;)
 
ASSERT c'est une macro équivalente à void en release. En debug ça affiche un message d'assertion si la condition de ASSERT n'est pas vérifiée.
Il y a un équivalent pour DEBUG et RELEASE c'est VERIFY.

n°1134663
HelloWorld
Salut tout le monde!
Posté le 29-06-2005 à 13:32:33  profilanswer
 

ASSERT n'est pas standard, assert (minuscule) l'est ;)
J'ai pas pigé non plus la remarque de Taz, mais oui VC++ 6 renvoie NULL avec new en cas d'échec, et lève une exception à partir de VC++ 7. Faut donc faire gaffe, car ça peut poser des pblm de migration de code. On rappelle aussi au passage que VC++ 6 est un vieux compilateur, et qu'il serait bon de penser à l'enterrer, surtout que la version 8 va pas tarder...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1134682
slash33
Posté le 29-06-2005 à 13:54:32  profilanswer
 

Je veux bien passer à VC++ 7 ou 8 mais là faut négocier avec ma boîte pour me le fournir...  :pt1cable:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  débordement mémoire!

 

Sujets relatifs
ORACLE : occupation mémoire du varchar2[SGBD]Consommation memoire SQL SERVER 2000
Modifier document.cookie en memoire vivedéfinir mémoire
Gestion de la mémoire en delphi?wxWidget et partage de mémoire
liberation de la memoire utiliseImposer l'emplacement mémoire de certaines variables
Monter une image en mémoire[C 16bits] débordement mémoire !?
Plus de sujets relatifs à : débordement mémoire!


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)