我有一个类foo(std::vector<double> values
)的私有静态成员变量。在dll中有一个foo对象(接口类和实现类idiom)。这是头文件&#39; foo.h&#39;:
class foo
{
public:
foo();
~foo();
private:
static std::vector<double> values;
};
定义文件&#39; foo.cpp&#39;:
#include "foo.h"
std::vector<double> foo::values;
foo::foo()
{
values.resize(10UL);
}
foo::~foo()
{
for (auto& v :values)
{
v = 99.9;
}
}
Foo是在dll中构建的,我有我的接口类(文件&#39; interface.h&#39;):
class interface
{
public:
interface();
~interface();
foo myFoo;
};
extern "C" foo* getFooObject();
我的&#39; interface.cpp&#39;中的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++ Static variables in dynamic DLL lifetime. or why they dead?
我将Visual Studio 2013与Intel Parallel Studio XE 2016一起使用。
答案 0 :(得分:1)
您在这里遇到了多个问题:
values
和myInterface
都被定义为静态变量,因此您无法依赖销毁序列(实际上,{{1}可以在values
之前销毁。如果两者都在同一个编译单元中,那么您可以依赖它(参见this)。myInterface
后,客户端获得的指针也无效。所以最重要的是,目前还不清楚你想要实现的目标(为什么你要使用Run-Time Dynamic Linking代替Load-Time Dynamic Linking?)。即使您正在制作需要在运行时加载内容的模块化系统,也要正确设计它,以便从dll获取的对象不会超过库的生命周期(例如,通过工厂正确销毁所有对象的管理器类通过在调用FreeLibrary
之前调用相应的析构函数来完成函数。