Singleton实例两次

时间:2014-12-11 14:20:36

标签: c++ cocoa singleton

我正在重写这个问题,因为我意识到在第一次提出这个问题时我并没有理解这个问题而且这个问题非常混乱。

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

的main.cpp

 #include <GameEngine.h>
 #include <iostream>

 main() {

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

     engine.doSomething();

}

现在它在Headerfile中调用getInstance时工作正常:

Inside Library GameEngine.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
}

但是当我没有将函数定义放在标题内,但在源文件中,它给了我一个不同的地址:

Inside Library GameEngine.cpp

 #include "GameEngine.h"

 void GameEngine::doSomething() {

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

 }

找到解决方案:D

我将动态库更改为静态库,这使它工作。

1 个答案:

答案 0 :(得分:0)

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

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