Question

Je travaille sur un projet qui a une classe «A» qui contient une classe de conteneur STL statique. Cette classe est incluse à la fois dans mon programme principal et un fichier .so. La classe utilise le constructeur / destructeur par défaut (implicite, non déclaré). Le programme principal charge le fichier .so à l'aide de dlopen () et dans son destructeur, appelle dlclose (). Le programme se bloque après les sorties principales lorsque GLIBC appelle le destructeur de la variable de membre de classe statique. Le problème semble être que lorsque dlclose () est appelé, le destructeur de la variable statique est appelé, alors lorsque les sorties principales () GLIBC appelle également le destructeur, résultant en un double libre.

J'ai 2 questions, à savoir:
1) Dans ce cas particulier, pourquoi n'y a-t-il pas deux copies de la variable statique (oui je sais que cela semble un peu ridicule, mais comme le programme principal et le fichier. une?)
2) Existe-t-il un moyen de résoudre ce problème sans réécrire la classe «A» pour ne pas contenir de variables de membres statiques?

Était-ce utile?

La solution

Cette question a été résolue dans une autre question que j'ai publiée. Fondamentalement, il y avait en effet deux copies de la variable statique - une dans le programme principal et une dans la bibliothèque partagée, mais le lien d'exécution résolvait les deux copies de la copie principale des programmes. Voir cette question pour plus d'informations:

Le programme principal et la bibliothèque partagée initialisent la même variable statique dans __static_inialization_and_destruction_0

Autres conseils

Je crois que les classes STL sont toujours créées dynamiquement afin que vous ne puissiez pas les appeler statiques. Ils existent sur le tas. Si le membre est transmis à une fonction, une copie est mise en mémoire statique. Vous devez faire votre propre destructeur qui supprime explicitement la STL une fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top