В Linux, почему деструктор дважды запускается на общем экземпляре глобальной переменной в C ++? - PullRequest
7 голосов
/ 04 августа 2010

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

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

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

0 голосов
/ 05 августа 2010

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

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

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

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

...