首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例实例两次

单例实例两次
EN

Stack Overflow用户
提问于 2014-12-11 22:20:36
回答 1查看 137关注 0票数 3

我重写了这个问题,因为当我第一次问这个问题时,我意识到我不理解这个问题,这个问题变得非常混乱。

我在库中有一个Singleton-Pattern类(Meyers )。当我在我的主应用程序和库中的.cpp中调用getInstance()时,我得到了两个不同的地址。当我在Librarys头中调用getInstance()时,它的地址是相同的。

main.cpp

代码语言:javascript
复制
 #include <GameEngine.h>
 #include <iostream>

 main() {

     GameEngine& engine = GameEngine::getInstance();
     std::cout << &engine;    // gives me address A

     engine.doSomething();

}

现在,在Headerfile中调用getInstance时,它工作得很好:

内部库GameEngine.h

代码语言:javascript
复制
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
}

但是,当我没有将函数定义放在头文件中,而是放在源文件中时,它会给我一个不同的地址:

库GameEngine.cpp内幕

代码语言:javascript
复制
 #include "GameEngine.h"
 
 void GameEngine::doSomething() {
      
      GameEngine& engine = GameEngine::getInstance();
      std::cout << &engine;    // gives me address B

 }

找到了解决方案:D

我把动态库改成了静态库,这样它就可以工作了。

EN

回答 1

Stack Overflow用户

发布于 2015-11-25 17:22:15

每个DLL都有自己的静态数据实例,这实际上是使用DLL的真正问题之一(但也可能是优势之一,取决于您的观点

有一些技巧可以克服这一点,例如使用线程区域存储,但通常您必须确保DLL传递给单例,可能是在主应用程序中创建单例,然后将其作为某种上下文对象进行传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27425046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档