Bonjour,
Au boulot je fais toutes les semaines face a des crashs sur des gros logiciels dus au fait que certaines bibliotheques compilees avec une version differente de la runtime de Visual C++ (parfois juste un patch fix de visual suffit) crashent si jamais on utilise des objets standards tels que std::string a travers plusieurs modules ou si des objets sont crees dans une dll et ensuite detruits dans une autre. Tout ca parce que la fonction de destruction est pas la meme dans les runtimes de visual ou alors les modules ont des heap differents ou carrement la version de std::string n'est pas compatible binairement.
Par exemple si je fais une fonction comme ca :
Ca peut parfois crasher parce que f va faire des resize/push_back qui vont appeler un realloc qui est pas compatible avec le alloc que j'ai fais dans un autre module ou alors carrement parce que std::string n'est pas compatible au niveau binaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 void f(std::string & name)
Est-ce que si je fais :
Est-ce que ceci va marcher si l'allocation n'est pas compatible entre les deux modules et/ou si std::string n'est pas compatible entre les deux modules?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::string f(void)
En ce qui concerne le probleme de non compatibilite avec l'allocateur/destructeur, j'ai lu dans pas mal de bouquins et sur le net que shared_ptr permettait de resoudre partiellement ce probleme en garantissant que le destructeur soit celui du module dans lequel l'objet avec etait cree.
Mais quid de la compatibilite binaire de shared_ptr lui-meme? Est-ce qu'il y a une certaine garantie entre les differentes versions de boost? Avec la version de Visual? de gcc? J'ai regarde le draft de C++0x et il n'y a rien du tout la-dessus si ce n'est que les ameliorations apportees n'impliquent pas forcement une incompatibilite binaire, rien ne garantie la compatibilite binaire avec d'anciennes versions ou avec boost.
Partager