2010-07-19 6 views
1

J'ai une classe singleton (s'il vous plaît, ne parlez pas de l'utilisation de singleton).Problèmes de mémoire

class InputSystem : boost::serialization::singleton<InputSystem> 
{ 
private: 
    boost::shared_ptr<sf::Window> mInputWindow; 
public: 
    InputSystem() 
    { 
     mInputWindow = boost::shared_ptr<sf::Window>(new sf::Window(someARgs)); 
     someMethod(); 
    } 

    void someMethod() 
    { 
     mInputWindow->...() // Calling some methods of sf::Window class 
     // Everything is fine here 
    } 

    const sf::Input &Handle() const 
    { 
     return mInputWindow.get()->GetInput(); 
    } 
}; 

void main() 
{ 
    InputSystem::get_mutable_instance().Handle(); // Here is all members of InputSystem have invalid addresses in memory (0x000) 
} 

Qu'est-ce qui ne va pas?

+4

Il est impossible de répondre sans la définition 'singleton :: get_mutable_instance()'. – Klaim

+5

Alors, quel est votre modèle de classe 'singleton <>'? (Et comment tout peut-il être correct à 'someMethod()' quand vous ne l'appelez jamais dans l'exemple de code?) Les échantillons incomplets ne font pas de grandes questions. –

+0

@Klaim Ceci est singleton à partir de la sérialisation boost – Ockonal

Répondre

3

Voici tous les membres de InputSystem ont des adresses invalides en mémoire (0x000)

Soit someMethod() vos données est de la réduction à zéro classe, ou que vous avez mal diagnostiqué la question.

Changer votre fonction principale à ceci:

InputSystem& inputSystem = InputSystem::get_mutable_instance(); 
inputSystem.Handle(); 

Cela met la création du singleton et la première tentative de l'utiliser sur des lignes séparées. Lancez votre débogueur et parcourez le code à la recherche du point exact que les données de votre singleton sont corrompues.

+0

Au moment d'obtenir l'instance de la classe, toutes les données sont détruites. – Ockonal

+0

@Ockonal: Votre constructeur est-il déjà appelé? – Gunslinger47

+0

@ gunslinger47 Oui, le débogueur me montre que 'someMethod()' appelle. – Ockonal

Questions connexes