Продолжительность жизни переменной-члена stati c, объявленной и инициализированной в динамически загружаемой DLL - PullRequest
0 голосов
/ 29 апреля 2020

Пожалуйста, рассмотрите следующий пример кода. Мой вопрос: где Foo :: bar хранится в памяти? Хранится ли он в хранилище программы c, в которое скомпилировано main. cpp? Если это так, что происходит, когда myDll.so выгружается?

//myDll.hpp

//class definitions
class Bar
{
  public:
    Bar() = default;
};

class Foo
{
  public:
    static Bar bar;
};

//declaring free function to be exported
extern "C" Bar* getBar();

//myDll.cpp
#include "myDll.hpp"

//initializing static member variable
Bar Foo::bar;

//definition of exported function
Bar* getBar()
{
  return &(Foo::bar);  
}

Предположим, что myDll. cpp преобразован в myDll.so, например: g++ -shared -fPIC -o myDll.so myDll.cpp, и он динамически загружается следующим образом:

//main.cpp
void* handle = dlopen( "/path/to/dll/myDll.so", RTLD_NOW);
// do stuff with handle...
dlclose( handle ); 

Что происходит при вызове dlclose ()? Foo :: bar go выходит за рамки сразу?

1 Ответ

1 голос
/ 29 апреля 2020

Да. Foo::bar существует в разделе хранения stati c (сегмент ".data") myDll.so, который не будет отображен после dlclose.

Я могу вспомнить два исключения:

  • Библиотека C не требуется для выгрузки DLL. Некоторые библиотеки C (например, musl ) явно документируют, что они no-op dlclose()
  • dlopen / dlclose подсчитываются. Если вы дважды вызывали dlopen в одной и той же библиотеке, первый вызов dlopen не выгрузит библиотеку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...