2010-08-04 19 views
7

En Linux tengo algún código C++ generado de una biblioteca estática que define una variable global. Una sola instancia de esta variable global se comparte entre dos bibliotecas compartidas que hacen referencia a su símbolo.En Linux, ¿por qué el destructor se ejecuta dos veces en una instancia compartida de variable global en C++?

Cuando el proceso se apaga y se ejecuta la fase de terminación estática, veo que el destructor en esta instancia compartida se ejecuta dos veces. Presumiblemente una vez por biblioteca cuando cada descarga.

Esta pregunta está estrechamente relacionada con otra que vi recientemente aquí: related question. Esto suena como el mismo comportamiento, pero no hay discusión sobre por qué está sucediendo.

¿Alguien sabe la explicación teórica detrás de este comportamiento?

+0

Solo debe ejecutarse una vez por variable según el código generado por el compilador. Intente obtener la dirección de la variable a medida que se ejecuta el destructor para verificar que sea el mismo objeto. –

+0

Quizás almacenaste un puntero al objeto en alguna clase de puntero inteligente, que intenta destruir su targer. –

+0

Entonces, ¿global se define en (una unidad de compilación de) solo una de las bibliotecas? – Thomas

Respuesta

2

Si toma un puntero desnudo y lo coloca en un puntero inteligente (dos veces), se destruirá dos veces, una por cada recuento de contenedor cayendo a cero.

Por lo tanto, si pasa el puntero desnudo a ambas bibliotecas, eso lo haría. Cada uno lo coloca en un objeto de puntero compartido y cada uno de ellos realiza la destrucción. Si puede ver la traza inversa de la pila durante el proceso, eso debería mostrar que sucede en ambas bibliotecas.

+1

Usando cualquier depurador regular, debería ser fácil comprobar la traza inversa de la pila de llamadas y averiguar quién llama a este destructor. – Vargas

0

C++ tiene una regla llamada la "Regla Una Definición":

Cada programa deberá contener exactamente una definición de cada función o un objeto no en línea que se utiliza en ese programa; no se requiere diagnóstico. La definición puede aparecer explícitamente en el programa, se puede encontrar en la biblioteca estándar o definida por el usuario, o (cuando corresponda) está implícitamente definida (ver 12.1, 12.4 y 12.8).

Wikipedia tiene un article que explica esto con más detalle.

No ha publicado el código en su pregunta, por lo que no puedo estar seguro acerca de su caso, pero en the question you linked to, el ejemplo en la pregunta fue definir la misma variable en dos bibliotecas compartidas. Esto violaba la "Regla de una sola definición", de la que aparentemente depende la estrategia de finalización del vinculador dinámico, lo que hace que el destructor sea llamado dos veces.

Cuestiones relacionadas