В С++, если у меня есть глобальная переменная, которая является уникальным указателем на класс. Эта глобальная переменная должна быть инициализирована до выполнения main. Допустим, в main создано несколько потоков, и этим потокам необходимо прочитать ресурсы, находящиеся за уникальным указателем.
Вопрос: Когда этот уникальный указатель уничтожается? Это когда основной поток выходит из основной функции или вызывает выход?
«Означает ли это другие процессы…» вы имеете в виду потоки? Или процессы?
«...Кто отвечает за счетчик ссылок уникального указателя...» уникальный указатель не имеет счетчика ссылок. Объекты со статическим временем жизни уничтожаются в порядке, обратном построению, после возврата из main
.
имхо, вам следует написать небольшой минимально воспроизводимый пример и задать по этому поводу один конкретный вопрос. В настоящее время ваш вопрос(ы) неясен, похоже, вы имеете в виду какие-то проблемы, но неясно, какие
И уничтожение всех объектов с длительностью хранения потока происходит до уничтожения любого объекта со статической длительностью хранения - даже если объекты с продолжительностью хранения потока были созданы первыми.
«Означает ли это, что другие процессы получают доступ к мусору» — я предполагаю, что вы имеете в виду потоки (а не процессы), и в этот момент они не должны получать доступ к чему-либо со статической длительностью хранения. Считайте, что прошло!
Функция входа main
вызывается загрузчиком запуска примерно так: void startup() { /*...initialize globals...*/; exit(main(argc, argv)); }
Глобальные и локальные статические переменные разместили свои деструкторы с помощью atexit
. Если во время удаления atexit возникнет исключение, оно завершит работу приложения (что, вероятно, останется незамеченным). Другие ваши потоки должны были быть присоединены до возврата основного потока.
Рекомендация: избавьтесь от глобальной переменной. Глобальные переменные могут облегчить написание кода, но они НАМНОГО усложняют отладку программ. Поскольку отладка почти всегда НАМНОГО сложнее, чем написание, в ваших интересах перенести трудность туда, где она окажет наименьшее влияние, а именно на сторону написания.
Когда основной поток завершается, ваша программа завершилась. «Другие потоки» ничего не делают.
This global var should be initialized before main gets execute
Ни один хороший код не имеет глобальных переменных. Также будьте предельно ясны, что вы подразумеваете под «поток закончился», хороший дизайн потока имеет совместное завершение, и ваш вопрос сводится к обычному правилу: ваша жизнь заканчивается, когда заканчивается область, в которой принадлежит уникальный указатель.
Я считаю, что это должно работать следующим образом:
std::terminate()
, и ваша программа завершится.Кроме того, unique_ptr не имеет счетчика ссылок, он является единственным (уникальным) владельцем объекта, и при его уничтожении объект уничтожается.
Примечание: как только у вас есть несколько единиц перевода (TL;DR: несколько скомпилированных файлов cpp), все становится намного сложнее. Порядок создания и уничтожения элементов в единице перевода четко определен, но порядок, в котором единицы перевода создают и уничтожают, нет. Прочтите «Фиаско статического порядка инициализации», если хотите узнать кровавые подробности о том, как это может полностью <ругательство удалено> вывести из строя ваши программы.
Примечание: уничтожение потоков может быть крайне неприятным. Действия могут быть прерваны на полпути. Однажды я потерял много хороших миньонов, когда луч смерти не хранился должным образом из-за неполного отключения, и это сильно повлияло на мои планы по завоеванию мира.
какое количество ссылок? Это уникальный указатель, у него всего 1 владелец. Пожалуйста, по одному вопросу на вопрос