在动态加载的DLL中声明和初始化的静态成员变量的寿命

问题描述 投票:0回答:1

请考虑以下代码示例。我的问题是:Foo :: bar存储在内存中的什么位置?它存储在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是否会立即超出范围?

c++ dll static dynamic-loading
1个回答
0
投票

是。 Foo::bar存在于myDll.so的静态存储部分(“ .data”段)中,在dlclose之后将被取消映射。

我可以想到两个例外:

  • 不需要C库来卸载DLL。一些C库明确记录了它们无操作dlclose(),尽管依靠它可能是不明智的。
  • dlopen / dlclose被引用计数。如果您在同一库上两次调用过dlopen,则第一次调用dlopen不会卸载该库。
© www.soinside.com 2019 - 2024. All rights reserved.