aerger mit funktionspointern



  • ich habe ein problem mit folgendem code.
    wenn ich mehrmals mit new / delete instanzen der folgenden klasse erzeuge gibt eine memory exception.
    also wirklich nur erzeugen / freigeben, ohne weitere methodenaufrufe.

    wenn ich jedoch "initStateMachine" im CTOR _nicht_ aufrufe, dann gehts.
    hat jemand eine idee weshalb`?

    class TestStateMachine
    {
    	private:
    		struct StateMachine
    		{
    			bool (TestStateMachine::*doTrue)(void);
    			bool (TestStateMachine::*doFalse)(void);
    		};
    
    		StateMachine m_stateMachine;
    
    		void initStateMachine();
    		void testStateMachine();
    
    		//do methods for stateMachine
    		bool doError();
    		bool do_Connection();
    
    	public:
    		TestStateMachine();
    		~TestStateMachine();
    };
    
    TestStateMachine::TestStateMachine()
    {
    	initStateMachine();
    };
    
    TestStateMachine::~TestStateMachine()
    {
    };
    
    void TestStateMachine::initStateMachine()
    {
    	m_stateMachine.doTrue = &TestStateMachine::do_Connection;
    	m_stateMachine.doFalse = &TestStateMachine::doError;
    
    };
    

    //Nachtrag
    der aufruf innerhalb void testStateMachine() erfolgt mit:

    (*this.*m_StateMachine.doFalse)()
    (*this.*m_StateMachine.doTrue)()
    

    wird aber zum test nicht aufgerufen. d.h. speicherfehler taucht auch ohne diesen aufruf auf.

    //Nachtrag 2
    Hatte ganz vergessen zu erwaehnen: Nutze gcc 3.3.1 unter linux (kernel 2.4.21)



  • Hallo,
    poste doch bitte mal ein compilierbares und minimales Beispiel, dass das Problem verdeutlicht.



  • durch deine nachfrage nach einem kompilierbarem beispiel habe ich den fehler gefunden. 🙂

    ich hatte die funktionszeiger in ein array geschriebn, das zu klein bemessen war.
    und dieses array wurde in initStateMachine gefuellt.

    bei interesse kann ich das kompilierbare beispiel fur funktionszeiger posten - ist ja nun fertig.
    (ist ein parser auf tabellenbasis, der ueber einen index die memberfunktionen anspringt)


Anmelden zum Antworten