mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik KEIL/ARM7/C++: Mini-HEAP bei statischen erzeugten Objekten trotzdem nötig?


Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Code-Sammlung die auf mehreren unterschiedlichen Systemen 
inkludiert ist und darauf aufgebaut wird. Grundprinzip ist eine 
abstrakte Basisklasse die grundlegende Treiberfunktionen zur Verfügung 
stellt:
class DeviceDriver
{
private:
  const char* name;
public:
  MyClass(const char* name);
  virtual ~MyClass() {}; // Hier entsteht das Phänomen
  virtual void Init(void) = 0;
  virtual int32 Open(int32 param) = 0;
  virtual int32 Close(void) = 0;
  // ...
}

Alle anderen Klassen, die dann die Methoden (und ggf. zusätzliche eigene 
Methoden implementieren) sind von dieser Basisklasse abgeleitet. Das 
lässt sich auf diversen Compilern fehlerfrei kompilieren. Soweit so gut. 
Die Objekte werden ausschließlich statisch und global erzeugt. Es gibt 
zu keiner Zeit dynamisch erzeugte Objekte (new/delete). Garantiert! Da 
der Code sich in einer Endlosschleife bewegt, wäre theoretisch noch 
nichtmal der Destruktor nötig. Einige Compiler haben sich aber zurecht 
beschwert, wenn der Destruktor fehlt.

Jetzt hab ich das Ganze auch auf den KEIL RealView-C++ Compiler 
übertragen. Da ich wie gesagt keinerlei HEAP benötige habe ich im 
Startup-File selbigen auf Größe =0 gesetzt. Dann läuft das Programm aber 
nur, wenn es keinen expliziten Destruktor gibt! Lässt man ihn jedoch wie 
oben im Beispiel stehen, dann knallt es: Die Software verhängt sich 
irgendwo noch vor der main()-Schleife. Ich habe jetzt herausgefunden, 
dass sie aber doch läuft, wenn man einen HEAP von wenigstens 16 Bytes 
einstellt. Da ich aber ja alle Objekte statisch und global erzeugt habe, 
verstehe ich nicht wofür der die paar Bytes HEAP überhaupt braucht? 
Danach läuft der Code dann jedenfalls einwandfrei ... Dieses Verhalten 
tritt übrigens nur bei virtuellen Destruktoren von abstrakten Klassen 
auf, bei Destruktoren von "normalen" Klassen nicht.

Kann mir das jemand erklären, was der mit den 16 Bytes beim Startup 
veranstaltet und wofür er die zwingend braucht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.