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]

Répondre à