Почему в Linux деструктор запускается дважды на общем экземпляре глобальной переменной в C ++?

В Linux у меня есть сгенерированный код C ++ из статической библиотеки, которая определяет глобальную переменную. Один экземпляр этой глобальной переменной используется двумя разделяемыми библиотеками, которые ссылаются на ее символ.

Когда процесс завершается и запускается фаза статического завершения, я вижу, что деструктор на этом общем экземпляре запускается дважды! Предположительно один раз на библиотеку при каждой выгрузке.

Этот вопрос тесно связан с другим вопросом, который я недавно видел здесь: связанным вопросом . Это похоже на то же поведение, но не обсуждается, почему это происходит.

Кто-нибудь знает теоретическое объяснение этого поведения?

7
задан Community 23 May 2017 в 12:04
поделиться

2 ответа

. Если вы возьмете голый указатель и поместите его в интеллектуальный указатель (дважды), он будет уничтожен дважды, один раз для каждого контейнера refcount, уменьшающегося до нуля.

Итак, если вы передадите голый указатель в обе библиотеки, это сделает. Каждый помещает его в объект общего указателя, и каждый из них уничтожает. Если вы можете увидеть трассировку стека во время dtor, это должно показать, что это происходит в обеих библиотеках.

2
ответ дан 7 December 2019 в 18:38
поделиться

В C ++ есть правило, называемое «Правило одного определения»:

Каждая программа должна содержать ровно одно определение каждой не встроенной функции или объекта, которые используются в этой программе; диагностика не требуется. Определение может появиться в программе явно, его можно найти в стандартной или пользовательской библиотеке или (при необходимости) оно определено неявно (см. 12.1, 12.4 и 12.8).

В Википедии есть статья , в которой это объясняется более подробно.

Вы не разместили код в своем вопросе, поэтому я не могу быть уверен в вашем случае, но в вопросе, который вы связали с , пример в вопросе определял одну и ту же переменную в двух общие библиотеки. Это нарушает «одно правило определения», от которого, по-видимому, зависит стратегия завершения динамического компоновщика, в результате чего деструктор вызывается дважды.

0
ответ дан 7 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: