dll中静态成员变量的生命周期

时间:2017-03-27 13:39:47

标签: c++ c++11 dll

我有一个类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一起使用。

1 个答案:

答案 0 :(得分:1)

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

  1. 由于您已将代码拆分为多个文件,并且valuesmyInterface都被定义为静态变量,因此您无法依赖销毁序列(实际上,{{1}可以在values之前销毁。如果两者都在同一个编译单元中,那么您可以依赖它(参见this)。
  2. 即使有正确的销毁订单,在调用myInterface后,客户端获得的指针也无效。
  3. 所以最重要的是,目前还不清楚你想要实现的目标(为什么你要使用Run-Time Dynamic Linking代替Load-Time Dynamic Linking?)。即使您正在制作需要在运行时加载内容的模块化系统,也要正确设计它,以便从dll获取的对象不会超过库的生命周期(例如,通过工厂正确销毁所有对象的管理器类通过在调用FreeLibrary之前调用相应的析构函数来完成函数。