我有一个类 foo ( std::vector<double> values
) 的私有(private)静态成员变量。有一个foo的对象封装在一个dll中(接口(interface)类和实现类成语)。这是头文件“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)类(文件“interface.h”):
class interface
{
public:
interface();
~interface();
foo myFoo;
};
extern "C" foo* getFooObject();
还有我的“interface.cpp”文件中的 getter 函数:
#include "interface.h"
interface::interface(){}
interface::~interfacet(){}
interface myInterface;
extern "C"
{
foo* getFooObject()
{
return &myInterface.myFoo;
}
}
在我的主程序中,我用 ::LoadLibrary(libraryName)
加载了 dll ( window 操作系统)。当我执行 ::FreeLibrary(libraryHandle)
并在析构函数中设置断点 ~foo()
variables
似乎已经被摧毁了。有人可以帮我解决 dll 中静态成员变量的生命周期吗?如何防止调用析构函数时静态成员变量已经被销毁?
提前谢谢你。
可能是类似的问题:
c++ Static variables in dynamic DLL lifetime. or why they dead?
我将 Visual Studio 2013 与英特尔 Parallel Studio XE 2016 结合使用。
最佳答案
您在这里遇到了多个问题:
- 由于您已将代码拆分到多个文件中,并且
values
和myInterface
都被定义为静态变量,因此您不能指望销毁序列(所以实际上,values
可以在myInterface
之前销毁)。如果两者都在同一个编译单元中,您可以指望它(参见 this )。 - 即使有适当的销毁顺序,在调用
FreeLibrary
后,客户端获取的指针也会无效。
所以最重要的是,不清楚您要实现的目标(为什么要使用 Run-Time Dynamic Linking 而不是 Load-Time Dynamic Linking ?)。即使你正在制作一个需要在运行时加载东西的模块化系统,也要正确设计它,以便从 dll 获得的对象不会超过库的生命周期(例如,一个管理器类可以正确地销毁通过工厂创建的所有对象通过在调用 FreeLibrary
之前调用相应的析构函数来实现功能)。
关于c++ - dll中静态成员变量的生存期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43048061/