Domanda

Sto lavorando a un progetto che ha una classe "A" che contiene una classe di container STL statica. Questa classe è inclusa sia nel mio programma principale che in un file .so. La classe utilizza il costruttore/distruttore predefinito (implicito, non dichiarato). Il programma principale carica il file .so usando dlopen () e nel suo distruttore, chiama dlclose (). Il programma si blocca dopo le uscite principali quando GLIBC chiama il distruttore per la variabile membro della classe statica. Il problema sembra essere che quando viene chiamato dlclose (), viene chiamato il distruttore per la variabile statica, quindi quando le uscite principali () glabc chiama anche il distruttore, risultando in un doppio libero.

Ho 2 domande, vale a dire:
1) In questo caso particolare, perché non ci sono due copie della variabile statica (sì, so che sembra un po 'ridicolo, ma dal momento che sia il programma principale che così sono un file. uno?)
2) Esiste un modo per risolvere questo problema senza riscrivere la classe "A" per non contenere variabili membri statici?

È stato utile?

Soluzione

Questa domanda è stata risolta in un'altra domanda che ho pubblicato. Fondamentalmente c'erano in effetti due copie della variabile statica: una nel programma principale e una nella libreria condivisa, ma il linker di runtime stava risolvendo entrambe le copie alla copia dei programmi principali. Vedi questa domanda per ulteriori informazioni:

Programma principale e libreria condivisa inizializza la stessa variabile statica in __static_initialization_and_destruction_0

Altri suggerimenti

Credo che le classi STL siano sempre create dinamicamente in modo da non poterle chiamarle statiche. Esistono sul mucchio. Se il membro viene passato a una funzione, una copia viene messa nella memoria statica. Devi creare il tuo distruttore che elimina esplicitamente la STL una volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top