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++ - 是否可以在不同的类中编写/包装异常处理组件(try、catch)?

c++ - 使用不同的 enable_if 条件选择成员函数

c# - 在 C# 中调用 C++ DLL 库中的导出函数

c++ - 将指向结构的指针转换为具有较少数量字段的另一种结构类型

c++ - 为什么 const char* 返回的值丢失了两个字符?但是在返回之前打印正确的值

c++ - 根据用户输入创建特定类型的对象

c# - ASP.NET MVC 需要两个不同版本的 Newtonsoft.Json.dll

c# - 您如何部署自己的 Authenticode 时间戳服务?

c++ - 什么是 SWIG 警告 503?

c++ - 为几个可能的参数(类型名)专门化类