stack/heap



  • adonis schrieb:

    ...

    ...
    void main(void)
    {
    	DatenBank* myBank = new DatenBank;
    	progstart();
    	optionen();
    	delete myBank;
    }
    ...
    

    Hi,

    ein Hinweis noch: Wenn progstart(), optionen() oder irgendeine davon implizit aufgerufene Funktion (und sei sie noch so weit unten im System) eine exception wirft, wird delete nicht mehr aufgerufen. Dagegen hilft nur entweder "exceptionhandling mit try/catch" oder "scoping mit einem Stackobject" (auto_ptr o.ä.).
    Ich habe mir letzteres angewöhnt:

    template <typename PType>
    class AutoDelete {
    public:
    // Construction / Destruction
    	AutoDelete(PType _p) : p(_p) {}
    	~AutoDelete() { if(NULL != p) delete p;	}			
    private:
    // Attributes
    	PType p;
    // not to be implemented
    	AutoDelete(AutoDelete const &);
    	AutoDelete const & operator=(AutoDelete const &);
    ...
    };
    
    int main(int argc, char* argv[]) {
          DatenBank* myBank = new DatenBank;
          AutoDelete<DatenBank*> myBankScope(myBank); // kann man ab hier vergessen
          progstart();
          optionen();
          return 0;
    }
    

    muss aber jeder selbst wissen, ob einem das sowas wert ist und man mit den Einschränkungen (Kopierverbot) und Risiken (man kann natürlich myBank auch manuell löschen und AutoDelete dann auf den Hammer laufen lassen) leben kann/mag.
    (kann man mit zu schließenden Files etc. ebenso machen)

    Dein Beispiel ist allerdings etwas besonders:
    - Da das DatenBank-Objekt während der gesamten Programmlaufzeit existiert, würde das Betriebssystem den Speicher auch bei "vergessenem delete" höchstwahrscheinlich bei Programmende automatisch freigeben, aber
    - da "DatenBank" sehr komplex klingt, wird vermutlich beim "fachlichen Abräumen im Destruktor" noch einiges zu tun sein, was das Betriebssystem natürlich nicht übernehmen kann....

    Ich persönlich bin "Stackfan", weil es die Programme besser zu strukturieren "motiviert", die Dinge automatisiert, die letztlich nur lästige/fehleranfällige Tipparbeit sind und letztlich (IMHO) wartbarere und übersichtlichere Programme erzeugt.
    ... und an Speichergrenzen bin ich bislang noch nie gekommen - allerdings laufen unsere Programme auch auch "xGB-RAM-Kisten", bei denen es nicht so eine Rolle spielt und die wirklichen Datenmengen liegen im DB2 - Ausnahme: Speicherfresser durch "Heap-Programmierung". :p 😉

    Gruß,

    Simon2.


Anmelden zum Antworten