débordement mémoire!

débordement mémoire! - C++ - Programmation

Marsh Posté le 29-06-2005 à 09:38:14    

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).

Reply

Marsh Posté le 29-06-2005 à 09:38:14   

Reply

Marsh Posté le 29-06-2005 à 09:39:34    

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

Reply

Marsh Posté le 29-06-2005 à 09:53:45    

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;
}

Reply

Marsh Posté le 29-06-2005 à 09:54:55    

C'est le pushback qui foire plus exactement

Reply

Marsh Posté le 29-06-2005 à 10:24:38    

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
Reply

Marsh Posté le 29-06-2005 à 10:35:27    

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?

Reply

Marsh Posté le 29-06-2005 à 10:46:31    

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
Reply

Marsh Posté le 29-06-2005 à 10:56:57    

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.

Reply

Marsh Posté le 29-06-2005 à 11:37:00    

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

Reply

Marsh Posté le 29-06-2005 à 11:38:22    

Je vais y penser désormais

Reply

Marsh Posté le 29-06-2005 à 11:38:22   

Reply

Marsh Posté le 29-06-2005 à 11:38:41    

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

Reply

Marsh Posté le 29-06-2005 à 12:25:18    

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.

Reply

Marsh Posté le 29-06-2005 à 13:32:33    

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
Reply

Marsh Posté le 29-06-2005 à 13:54:32    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed