dll 中静态成员变量的生存期
Lifetime of static member variable in dll
我有一个类foo(std::vector<double> values
)的私有静态成员变量。在 dll 中封装了一个 foo 对象(接口类和实现类习惯用法)。这是头文件 '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.h'):
class interface
{
public:
interface();
~interface();
foo myFoo;
};
extern "C" foo* getFooObject();
我的"界面.cpp"文件中有一个 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 ++ 动态 DLL 生存期中的静态变量。 或者他们为什么死?
我将 Visual Studio 2013 与 Intel Parallel Studio XE 2016 结合使用。
您在这里遇到了多个问题:
- 由于您已将代码拆分到多个文件中,并且
values
和myInterface
都定义为静态变量,因此您不能指望销毁序列(因此实际上,values
可以在myInterface
之前销毁)。如果两者都在同一个编译单元中,你可以指望它(见这里)。 - 即使有正确的销毁顺序,在客户端获得的指针在调用
FreeLibrary
后也会无效。
所以底线是不清楚你想实现什么(为什么你想使用运行时动态链接而不是加载时动态链接?即使您正在制作一个需要在运行时加载内容的模块化系统,也要正确设计它,以便从 dll 获取的对象不会超过库的生命周期(例如,一个管理器类,通过在调用之前调用相应的析构函数来正确销毁通过工厂函数创建的所有对象FreeLibrary
)。
相关文章:
- 延长变量的生存期
- dll 中静态成员变量的生存期
- constexpr 表达式和变量生存期,G++ 和 Clang 不同意的一个例子
- 函数中静态变量的生存期
- C++ 中静态局部变量的范围和生存期
- 封闭环变量的生存期和范围是什么
- 指针是否延长了自动存储变量的生存期
- 静态变量生存期、文件范围与函数范围
- 块内变量的生存期是多少
- 使函数内联是否会影响绑定到其参数的临时变量的生存期
- C++向量、常量字符*、变量范围和生存期
- C++ 了解变量生存期和绑定生存期之间的区别
- 变量的范围与生存期
- 堆栈变量生存期好奇的例子
- C++临时变量生存期
- 变量的恒定性及其生存期
- 未扩展常量引用变量的生存期
- 在c++中,没有变量名的构造函数调用的生存期/作用域是什么?
- 单例类的成员变量的生存期是多少?
- 什么决定临时变量的生存期何时扩展为常量引用或重值引用