单例实例化了两次
Singleton instanced two times
我正在重写这个问题,因为我意识到我第一次问这个问题时并不明白这个问题,这个问题变得非常混乱。
我在库中有一个单例模式类(Meyers Singleton)。当我在我的主应用程序中和该库中的.cpp中调用 getInstance() 时,我得到了两个不同的地址。当我在库头中调用 getInstance() 时,它是相同的地址。
主.cpp
#include <GameEngine.h>
#include <iostream>
main() {
GameEngine& engine = GameEngine::getInstance();
std::cout << &engine; // gives me address A
engine.doSomething();
}
现在,在头文件中调用getInstance时,它可以正常工作:
内部图书馆游戏引擎.h
class GameEngine {
public:
static jglEngine& getInstance() // Singleton is accessed via getInstance()
{
static jglEngine instance; // lazy singleton, instantiated on first use
return instance;
}
void doSomething() {
GameEngine& engine = GameEngine::getInstance();
std::cout << &engine; // gives me also address A
}
private:
GameEngine() {};
GameEngine(GameEngine const&); // prevent copies
void operator=(GameEngine const&); // prevent assignments
}
但是当我不把函数定义放在头内,而是放在源文件中时,它会给我一个不同的地址:
在图书馆游戏引擎中.cpp
#include "GameEngine.h"
void GameEngine::doSomething() {
GameEngine& engine = GameEngine::getInstance();
std::cout << &engine; // gives me address B
}
找到解决方案:D
我将动态库更改为静态库,这使它正常工作。
每个 DLL 都有自己的静态数据实例,这实际上是使用 DLL 的真正问题之一(但也可能是优势之一,具体取决于您的观点)
有一些技巧可以克服这一点,例如使用线程区域设置存储,但通常您必须确保 DLL 通过单例传递,也许在主应用程序中制作单例,然后将其作为某种上下文对象传递。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 为什么常量成员可以初始化两次?
- 编译时检查是否有两个具有相同模板参数的模板实例化
- 如何获得C - 模板状行为,但仅允许实例化两种特定类型
- 当实例化两次时,C 提升线程会导致分割故障
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- C++类成员初始化了两次
- 类成员的C++静态成员变量实例化了两次
- 静态成员变量初始化两次
- 如何在不实例化两个c++类型的情况下确定这两个类型
- 我应该在哪里声明一个涉及多次实例化的类的枚举类
- 只实例化派生类一次错误的 OOP
- 单例实例化了两次
- 如何通过定义派生类的构造函数来实例化两个基类的私有数据成员
- c++如何初始化对象?下面的情况是这样做两次吗
- 我可以检查哪些函数模板至少实例化过一次吗
- OpenGL缓冲两次初始化
- 一次只实例化一组类中的一个类,以节省内存
- 隔离和多次实例化进程中的C库