В Linux у меня есть сгенерированный код C ++ из статической библиотеки, которая определяет глобальную переменную. Один экземпляр этой глобальной переменной используется двумя разделяемыми библиотеками, которые ссылаются на ее символ.
Когда процесс завершается и запускается фаза статического завершения, я вижу, что деструктор на этом общем экземпляре запускается дважды! Предположительно один раз на библиотеку при каждой выгрузке.
Этот вопрос тесно связан с другим вопросом, который я недавно видел здесь: связанным вопросом . Это похоже на то же поведение, но не обсуждается, почему это происходит.
Кто-нибудь знает теоретическое объяснение этого поведения?
. Если вы возьмете голый указатель и поместите его в интеллектуальный указатель (дважды), он будет уничтожен дважды, один раз для каждого контейнера refcount, уменьшающегося до нуля.
Итак, если вы передадите голый указатель в обе библиотеки, это сделает. Каждый помещает его в объект общего указателя, и каждый из них уничтожает. Если вы можете увидеть трассировку стека во время dtor, это должно показать, что это происходит в обеих библиотеках.
В C ++ есть правило, называемое «Правило одного определения»:
Каждая программа должна содержать ровно одно определение каждой не встроенной функции или объекта, которые используются в этой программе; диагностика не требуется. Определение может появиться в программе явно, его можно найти в стандартной или пользовательской библиотеке или (при необходимости) оно определено неявно (см. 12.1, 12.4 и 12.8).
В Википедии есть статья , в которой это объясняется более подробно.
Вы не разместили код в своем вопросе, поэтому я не могу быть уверен в вашем случае, но в вопросе, который вы связали с , пример в вопросе определял одну и ту же переменную в двух общие библиотеки. Это нарушает «одно правило определения», от которого, по-видимому, зависит стратегия завершения динамического компоновщика, в результате чего деструктор вызывается дважды.