Variables de classe statique dans la bibliothèque dynamique et le programme principal [Duplicate
-
26-09-2019 - |
Question
Cette question a déjà une réponse ici:
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?
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:
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.