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

标签 c++ c++11 dll

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

最佳答案

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

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

所以最重要的是,不清楚您要实现的目标(为什么要使用 Run-Time Dynamic Linking 而不是 Load-Time Dynamic Linking ?)。即使你正在制作一个需要在运行时加载东西的模块化系统,也要正确设计它,以便从 dll 获得的对象不会超过库的生命周期(例如,一个管理器类可以正确地销毁通过工厂创建的所有对象通过在调用 FreeLibrary 之前调用相应的析构函数来实现功能)。

关于c++ - dll中静态成员变量的生存期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43048061/

相关文章:

c++ - BFS 可以找到图中的环吗?

c++ - 通过右值引用返回更有效吗?

python - 如何修复导入错误: DLL load failed for scipy.空间模块?

dll - 在 TFS Build 上找不到 Blend 4 DLL

c++ - 强制 GCC 4.x 将 -Wreturn-type 视为错误而不启用 -Werror?

c++ - operator= 对于字符串集不明确

c++ - 在 32 位和 64 位中使用 for 循环反向迭代容器/字符串的元素而不发出警告

c++11 - Foreach 在特征矩阵上循环?

c++ - 如何将 int 复制到 u_char*

c# - Inno Setup 循环遍历文件并注册每个 .NET dll