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


von Alexander I. (daedalus)


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:
1
class DeviceDriver
2
{
3
private:
4
  const char* name;
5
public:
6
  MyClass(const char* name);
7
  virtual ~MyClass() {}; // Hier entsteht das Phänomen
8
  virtual void Init(void) = 0;
9
  virtual int32 Open(int32 param) = 0;
10
  virtual int32 Close(void) = 0;
11
  // ...
12
}

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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.