2017-03-27 271 views
1

我有一个foo类的私有静态成员变量(std::vector<double> values)。有一个foo封装的对象(接口类和实现类成语)。这是头文件“foo.h中”:dll中静态成员变量的生存期

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; 
    } 
} 

富是DLL,在那里我有我的接口类(文件内部构造'interface.h'):

class interface 
{ 
public: 
    interface(); 
    ~interface(); 

    foo myFoo; 
}; 

extern "C" foo* getFooObject(); 

和getter函数在我的 'interface.cpp' 文件:

#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与英特尔Parallel Studio XE 2016

+2

你的问题没有解释'foo'是如何构建的。它是在DLL内部构建的,并通过工厂函数或getter暴露出来?或者,也许有一个单一的静态实例'foo'里面的dll得到返回莫名其妙? –

+0

你不能阻止,必须在FreeLibrary之前调用〜foo()。 – KonstantinL

+0

@RudolfsBundulis:感谢您的评论。我编辑了我的问题并添加了界面以显示foo是如何构建和暴露的。 –

回答

1

您正在运行到多个问题在这里:

  1. 由于您已将代码拆分为多个文件,并且valuesmyInterface都被定义为您无法修改的静态变量t的销毁序列(实际上,values可能在myInterface之前被销毁)。如果两者都在同一个编译单元中,则可以指望(请参阅this)。
  2. 即使有适当的销毁顺序,在调用FreeLibrary之后,在客户端获得的指针也是无效的。

因此,底线是,它是不是不清楚你想达到什么(你为什么要使用Run-Time Dynamic Linking代替Load-Time Dynamic Linking?)。即使你正在制作一个需要在运行时加载东西的模块化系统,也要适当地设计它,以便从dll中获得的对象不会超过库的生命周期(例如,一个管理员类可以正确销毁通过工厂创建的所有对象通过在调用FreeLibrary之前调用相应的析构函数来执行函数)。