Problem mit der Speicherverwaltung - vermutlich



  • Der nachfolgende Code wird korrekt ausgeführt, aber nach der Ausführung wird eine Fehlermeldung ausgegeben, welche u.a. diesen Hinweis enthält: "probably corrupted stack"
    Das Problem scheint vordergründig durch diese Zuweisung zu entstehen:

    listeners[listenersCounter] = *listener;
    
    class Signal {
    public:
        Signal();
        virtual ~Signal();
        float getValue() { return(value); }
        void setValue(float vlaue);
        void addListener(Signal* listener);
        void signalUpdated(Signal* signal);
    private:
        float value;
        int listenersCounter;
        Signal *listeners;
    };
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "Signal.h"
    
    Signal::Signal() {
      value = 0.0;
      listenersCounter = 0;
      listeners = NULL;
    }
    
    Signal::~Signal() {
      if (listenersCounter > 0) {
          free(listeners);
      }
    }
    
    void Signal::addListener(Signal* listener) {
      listeners = (Signal*)realloc(listeners, sizeof(listener) * (listenersCounter + 1));
      // CAUSES THE CRASH!
      listeners[listenersCounter] = *listener;
      ++listenersCounter;
    }
    
    void Signal::setValue(float value) {
      this->value = value;
      for (int i=0; i<listenersCounter; i++) {
        listeners[i].signalUpdated(this);
      }
    }
    
    void Signal::signalUpdated(Signal* signal) {
      printf("The signal's value: %f\n", signal->getValue());
    }
    
    #include <stdlib.h>
    #include <stdio.h>
    
    #include "Signal.h"
    
    int main(int argc, char** argv) {
      Signal signal1;
      signal1.setValue(1.1);
      printf("Value signal1: %f\n", signal1.getValue());
    
      Signal signal2;
      signal2.setValue(2.2);
      printf("Value signal2: %f\n", signal2.getValue());
    
      signal1.addListener(&signal2);
      signal1.setValue(3.3);
    }
    

    Ich verwende diesen Code in einem Mikrocontroller, dessen Compiler nur einen beschränkten C++ Sprachumfang unterstützt. Aus diesem Grund kann ich keine C++ spezifische Funktionalität zur Verwaltung dynamischer Arrays verwenden.

    Vielen Dank für eure Hilfe.



  • Dein Mikrocontroller kommt mit klassen klar, aber du kannst kein new verwenden? Das ist eigenartig,aber ich kenne mich acuh nicht so mit Mikrocontroller aus.Wäre es denn möglich das du new verwendest, weil das würde die sache etwas vereinfachen.



  • Das geht nicht. Wenn Du C-Funktionen für die Speicheranforderungen benutzt, werden die Konstruktoren Deiner Klassen nicht aufgerufen. Vermutlich ist listenersCounter nicht initialisiert, und Deine Arrayindizes zeigen daher ins Nirvana.
    Also entweder, Du bekommst heraus, wie Du die C++-Operatoren für die Speicheranforderung zum Laufen bekommst (das MUSS eigentlich gehen), oder Du programmierst das Ding in C.



  • Ich kann new und delete verwenden und damit ist mein Problem gelöst.
    Danke für die Antworten!

    #include <stdlib.h>
    #include <stdio.h>
    
    #include "Signal.h"
    
    int main(int argc, char** argv) {
      Signal *signal1 = new Signal;
      signal1->setValue(1.1);
      printf("Value signal1: %f\n", signal1->getValue());
    
      Signal *signal2 = new Signal;
      printf("Value signal2: %f\n", signal2->getValue());
    
      signal1->addListener(signal2);
      signal1->setValue(3.3);
    }
    


  • Ja dann benutz es doch?



  • Ihr seid schnell hier und darum hat sich mein geänderter Eintrag mit dem von Firefighter überschnitten.



  • eigentlich meinten wir eher, du sollst da wo du aktuell mit c-speichermanagment arbeitst, auf das c++ äquivivalent umsteigen.Da wo realloc steht, kommt new hin.
    Lies dir mal durch wie man richtig mit new umgeht, dann sollte das kein Problem für dich sein, denke ich.


Anmelden zum Antworten