Pergunta

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?

Foi útil?

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:

O programa principal e a biblioteca compartilhada inicializam a mesma variável estática em __static_initialization_and_destruction_0

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top