PDA

Voir la version complète : Memory management


Ced666
17/04/2005, 15h15
Salut !

En fait, cette question concerne surtout Loulou vu que c'est à propos du CMemoryManager expliqué dans son tutoriel (ici (http://loulou.developpez.com/tutoriels/moteur3d/partie1/#L2.2) ).
Voila, après avoir implémenté ce MemoryManager, j'ai des erreurs qui sont générées:

c:\program files\microsoft visual studio\vc98\include\xlocale(218) : error C2660: 'new[]' : function does not take 1 parameters
c:\program files\microsoft visual studio\vc98\include\xlocnum(53) : see reference to function template instantiation 'char *__cdecl std::_Maklocstr(const char *,char *)' being compiled
c:\program files\microsoft visual studio\vc98\include\xlocale(218) : error C2660: 'new[]' : function does not take 1 parameters
c:\program files\microsoft visual studio\vc98\include\xlocnum(54) : see reference to function template instantiation 'unsigned short *__cdecl std::_Maklocstr(const char *,unsigned short *)' being compiled

Cela est probablement dû au fait que les macros surdéfinissant new et delete sont prises en comptes dans les fichiers de la librairie standard... Mais pour quelle raison, ça je l'ignore...

Quelqu'un a-t-il déjà eu un problème similaire ?
Merci de votre aide (parce que bon, c'est chouette d'avoir un programme avec pleins de lignes de code mais on n'est jamais certain qu'il n'y a de memory leak :) )

Loulou
17/04/2005, 15h49
Effectivement, c'est un problème récurrent qui apparait avec la redéfinition d'une macro new.

Cela n'apparait pas toujours (personnellement je n'en souffre pas dans mon moteur -- touchons du bois), et pour l'instant je n'ai encore jamais vu de solution pour y pallier.

Le seul conseil que je puisse te donner et de vérifier que tu inclues bien toujours ton header redéfinissant new après tous les autres (surtout les en-têtes standards), on ne sait jamais. Sinon je ne sais pas trop.

Ce qui serait intéressant c'est que tu extraies un exemple minimal complet qui reproduit le problème, et que tu le postes ici.

Ced666
17/04/2005, 16h39
Et bien par exemple, c'est assez bizarre mais si je crée un nouveau projet (type console) et que j'ajoute le code suivant (et rien que ça, avec évidemment les fichiers utiles pour le MemoryManager):

#include "DebugNew.h"

int main(int argc, char* argv[])
{
char* test = new char[25];
return 0;
}

J'ai pas d'erreur à la compilation mais par contre ça plante qd je l'exécute("L'instruction blahblah.. La mémoire ne peut-ête "read'). En utilisant le debugueur, j'ai vu que l'opérateur surchargé delete est appelé :00000005: (et apparement lors de la libération d'un objet de la librairie standard: ça plante dans le fichier XTREE).
Mais bon, ici, apparement le new surchargé n'est pas utilisé mais juste le delete... Hum hum, c'est assez prise de tête...

Loulou
17/04/2005, 17h26
Hum hum, c'est assez prise de tête...
Comme tu dis... :00000010:

En ce qui concerne ton exemple, ça me paraît tout de même bizarre. Tu es sûr que dans ton MemoryManager tu gères correctement la destruction des objets non alloués par le gestionnaire (cas où le pointeur n'est pas dans la table associative) ?

Ced666
18/04/2005, 08h18
J'ai pris les fichiers que tu as joints à ton tutoriel et j'ai rien modifié (j'ai juste retiré les exceptions je pense).

Loulou
18/04/2005, 16h33
Bizarre, je retesterai ça quand je serai chez moi. Mais bon, je sais qu'avec VC7 je n'aurai pas les mêmes erreurs que tu as avec VC6, ça risque d'être dur à debugger tout ça.

Ced666
19/04/2005, 09h24
Loulou, je t'ai envoyé un message privé avec mon adresse MSN. Si je peux t'être utile pour debugger, ce sera avec plaisir :) (notamment si tu veux que j'essaye certains trucs avec VC6).

Yeri
25/04/2005, 22h03
Hello

J'ai exactement le meme problème que Ced666, et j'aimerais savoir si vous avez trouvé une solution ?

En fait ça plante lors du "free" qui détruit les objets non alloués par le gestionnaire, et pourtant j'utilise VC7.1 :00000032:

Loulou
26/04/2005, 12h19
Ce qui serait pas mal, c'est que vous mettiez en ligne un projet VC++ complet et minimal reproduisant le problème. Bicoze personnellement j'ai du mal à reproduire ce genre de problème.

Yeri
26/04/2005, 13h18
c bon je crois que je viens de trouver d'où cela provient (chez moi en tout cas),
en fait dans les propriétés du projet VC qui crée l'exécutable j'avais comme "Runtime Library" Multi-threaded Debug (/MTd) et en mettant
Multi-threaded Debug DLL (/MDd) ça marche nikel. :00000014:

Je sais pas trop quelle est la différence mais ça fonctionne.

Ced666
26/04/2005, 20h01
Alors ça c'est fort... Si je change les propriétés de l'exécutable en Debug MultiThreaded (comme pour Yeri), j'ai de nouveau les erreurs à la compilation:

c:\program files\microsoft visual studio\vc98\include\xlocale(218) : error C2660: 'new[]' : function does not take 1 parameters
c:\program files\microsoft visual studio\vc98\include\xlocnum(53) : see reference to function template instantiation 'char *__cdecl std::_Maklocstr(const char *,char *)' being compiled
c:\program files\microsoft visual studio\vc98\include\xlocale(218) : error C2660: 'new[]' : function does not take 1 parameters
c:\program files\microsoft visual studio\vc98\include\xlocnum(54) : see reference to function template instantiation 'unsigned short *__cdecl std::_Maklocstr(const char *,unsigned short *)' being compiled
Error executing cl.exe.

Et c'est toujours l'exemple minuscule que j'ai posté au dessus... (donc en plus de ce fichier, j'ai inclu les fichiers DebugNew.h, Exception.cpp, Exception.h, File.cpp, File.h, MemoryManager.h et MemoryManager.cpp).

(Donc voila pour le projet minimal et complet, je pense que plus minimal que ça, tu meurs :) ).

That's strange !