Pregunta

Estoy trabajando en un proyecto que tiene una clase 'A' que contiene una clase de contenedor STL estática. Esta clase está incluida tanto en mi programa principal como en un archivo .sO. La clase utiliza el constructor/destructor predeterminado (implícito, no declarado). El programa principal carga el archivo .sO usando dlopen () y en su destructor, llama dlClose (). El programa se bloquea después de las salidas principales cuando GLIBC llama al destructor para la variable de miembro de la clase estática. El problema parece ser que cuando se llama dlClose (), se llama al destructor para la variable estática, luego cuando las salidas principales () GLIBC también llama al destructor, lo que resulta en un doble libre.

Tengo 2 preguntas, a saber:
1) En este caso particular, ¿por qué no hay dos copias de la variable estática (sí, sé que eso suena algo ridículo, pero dado que tanto el programa principal como el archivo. ¿una?)
2) ¿Hay alguna forma de resolver este problema sin reescribir la clase 'A' para no contener variables de miembros estáticos?

¿Fue útil?

Solución

This question has been resolved in another question I posted. Basically there were indeed two copies of the static variable -- one in the main program and one in the shared library, but the runtime linker was resolving both copies to the main programs copy. See this question for more information:

Main Program and Shared Library initializes same static variable in __static_initialization_and_destruction_0

Otros consejos

I believe that STL classes are always dynamically created so you can't actually call them static. They exist on the heap. If the member is passed to a function then a copy is put into static memory. You have to make your own destructor that deletes the stl explicitly once.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top