dll 中静态成员变量的生存期

Lifetime of static member variable in dll

本文关键字:生存期 变量 静态成员 dll      更新时间:2023-10-16

我有一个类foo(std::vector<double> values)的私有静态成员变量。在 dll 中封装了一个 foo 对象(接口类和实现类习惯用法)。这是头文件 'foo.h':

class foo
{
public:
foo();
~foo();
private:
static std::vector<double> values;
};

和定义文件'foo.cpp':

#include "foo.h"
std::vector<double> foo::values;
foo::foo()
{
values.resize(10UL);
}
foo::~foo()
{
for (auto& v :values)
{
v = 99.9;
}
}

Foo是在dll内部构造的,我有我的接口类(文件'interface.h'):

class interface
{
public:
interface();
~interface();
foo myFoo;
};
extern "C" foo* getFooObject();

我的"界面.cpp"文件中有一个 getter 函数:

#include "interface.h"
interface::interface(){}
interface::~interfacet(){}
interface myInterface;
extern "C"
{
foo* getFooObject()
{
return &myInterface.myFoo;
}
}

在我的主程序中,我用::LoadLibrary(libraryName)(Windows操作系统)加载dll。当我执行::FreeLibrary(libraryHandle)并在析构函数中设置断点时~foo()variables似乎已被破坏。有人可以帮助我解决 dll 中静态成员变量的生存期吗?如何防止在调用析构函数时静态成员变量已被销毁?

提前谢谢你。

可能是一个类似的问题:

c ++ 动态 DLL 生存期中的静态变量。 或者他们为什么死?

我将 Visual Studio 2013 与 Intel Parallel Studio XE 2016 结合使用。

您在这里遇到了多个问题:

  1. 由于您已将代码拆分到多个文件中,并且valuesmyInterface都定义为静态变量,因此您不能指望销毁序列(因此实际上,values可以在myInterface之前销毁)。如果两者都在同一个编译单元中,你可以指望它(见这里)。
  2. 即使有正确的销毁顺序,在客户端获得的指针在调用FreeLibrary后也会无效。

所以底线是不清楚你想实现什么(为什么你想使用运行时动态链接而不是加载时动态链接?即使您正在制作一个需要在运行时加载内容的模块化系统,也要正确设计它,以便从 dll 获取的对象不会超过库的生命周期(例如,一个管理器类,通过在调用之前调用相应的析构函数来正确销毁通过工厂函数创建的所有对象FreeLibrary)。