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?