Variáveis de classe estática na biblioteca dinâmica e no programa principal [duplicado]
-
26-09-2019 - |
Pergunta
Essa pergunta já tem resposta aqui:
Estou trabalhando em um projeto que possui uma classe 'A' que contém uma classe de contêiner stl estática.Esta classe está incluída no meu programa principal e em um arquivo .so.A classe usa o construtor/destruidor padrão (implícito, não declarado).O programa principal carrega o arquivo .so usando dlopen() e em seu destruidor chama dlclose().O programa trava após a saída principal quando a glibc chama o destruidor para a variável estática do membro da classe.O problema parece ser que quando dlclose() é chamado, o destruidor da variável estática é chamado, então quando main exits() a glibc também chama o destruidor, resultando em uma liberação dupla.
Tenho 2 perguntas, a saber:
1) Neste caso específico, por que não existem duas cópias da variável estática (sim, eu sei que parece um tanto ridículo, mas como tanto o programa principal quanto o arquivo .so têm um 'A' compilado separadamente, cada um deles não deveria ter um?)
2) Existe alguma maneira de resolver esse problema sem reescrever a classe 'A' para não conter variáveis de membro estáticas?
Solução
Esta questão foi resolvida em outra pergunta que postei.Basicamente, havia de fato duas cópias da variável estática - uma no programa principal e outra na biblioteca compartilhada, mas o vinculador de tempo de execução estava resolvendo ambas as cópias para a cópia do programa principal.Veja esta pergunta para mais informações:
Outras dicas
Acredito que as classes STL são sempre criadas dinamicamente, então você não pode chamá-las de estáticas.Eles existem na pilha.Se o membro for passado para uma função, uma cópia será colocada na memória estática.Você precisa criar seu próprio destruidor que exclua o stl explicitamente uma vez.