Le Wed, Apr 27, 2005 at 07:09:34PM +0200, Pierre THIERRY �crivait/wrote: > Hello, > > je suis en train de me mettre � �crire une biblioth�ques de classes en > C++, qui me servira ensuite pour des logiciels de jeu (principalement du > jeu de r�le). > > Je commence par les d�s, et je suis tomb� sur un os�: une de mes > classes comprend un m�thode qui est cens�e d�sallouer des objets dont > les pointeurs sont stock�s dans un conteneur de la STL, qui est un > membre priv� de la classe, et vider celui-ci au passage. > > Avec trois types diff�rents, j'obtiens trois bugs diff�rents, l'un tr�s > grave. > > Si c'est un vector<MonType*>, impossible de vider. un pop_back() quand > size() renvoit 1 fait passer � un �tat o� size() renvoit 33635908 > (2^25+81476, je trouvais que c'est �trangement ��proche�� d'une > puissance de 2), > > Si c'est un deque<MonType*>, au bout de quelques secondes, la machine > plante lamentablement, impossible de passer sur une console texte ou de > tuer le serveur X. Seule possibilit�, les Magic Keys du kernel, SIUB. Et > lorsque la machine red�marre, kernel panic. Un red�marrage > suppl�mentaire et elle d�marre comme une fleur. >
J'imagine qu'il y a une fuite m�moire, c'est � dire que vous utilisez la STL (que je connais mal) en C++ (que je n'aime gu�re) de fa�on � utiliser toute la m�moire disponible. Je n'ai pas le temps de plonger dans votre code. Mais si vous utilisez toute la m�moire (surtout en overcommit) vous pouvez observer un plantage sev�re. Pour �viter de planter la machine (et pour trouver plus rapidement vos bogues) une solution serait de limiter l'espace m�moire disponible pour votre processus. L'appel syst�me correspondant est setrlimit avec RLIMIT_AS ou RLIMIT_DATA, et votre shell l'interface par le builtin ulimit -v (pour bash) ou limit datasize (pour zsh et csh); aussi le plus simple est de taper la commande 'limit datasize 50m" dans le terminal zsh que vous utilisez pour tester votre programme. Pour ma part, je pref�re les langages dont l'implementation a un bon ramasse-miettes (ou GC= glaneur de cellules = garbage collector). Essayez par exemple Ocaml (http://caml.inria.fr/) � ce sujet. En efet, un ramasse-miettes vous facilite la vie, car vous n'avez plus � lib�rer explicitement vos donn�es (mais vous pouvez quand m�me d�border votre m�moire avec des donn�es "vivantes" qui croissent ind�finiement). Ne jugez pas les ramasses-miettes � l'aune de Java. Il existe aussi plusieurs ramasses-miettes utilisables en C ou en C++; le plus connu est celui de Boehm: qui �tant conservatif est simple � utiliser - remplacer new par new(GC) par exemple, ou malloc par GC_malloc; mais ce GC peut fuire un peu; il y a aussi Qish http://starynkevitch.net/Basile/qishintro.html qui est un GC exact qui n�cessite des r�gles de codage tr�s stricts et contraignantes et n'est pas multi-thread�. Le dernier "snapshot" de Qish est disponible en http://starynkevitch.net/Basile/qish-snapshot.tar.gz et son md5sum est bcfd620283e2c6d083d7fd379bd3cc75 Bon courage, en esp�rant vous avoir un petit peu aid�. -- Basile STARYNKEVITCH http://starynkevitch.net/Basile/ email: basile<at>starynkevitch<dot>net aliases: basile<at>tunes<dot>org = bstarynk<at>nerim<dot>net 8, rue de la Fa�encerie, 92340 Bourg La Reine, France -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

