Initialisierungen außerhalb des Cons? Exceptions sind "overhead"?



  • Ich habe mir ein bissl die Tutorials zu bada angeschaut. Da bada C++ zum erstellen von Anwendungen benutzt und ich persönlich nicht sehr verdraut bin mit C++ habe ich ein paar kurze Fragen:

    1. Ist zu empfehlen Initialisierungen von Member-Instanzen (also Objekte die einer Klasse gehören) NICHT im Konstruktor vorzunehmen, da dadurch leaked Objekte entstehen können?
      Beispiel:
    class Blub {
       SomeClass *s1;
       SomeClass *s2;
       public:
          Blub() {
             s1 = new SomeClass();
             s2 = new SomeClass(); // Out-of-memory exception
          }
    }
    

    So, nun will man sich hiervon ein Objekt anlegen, dabei passiert es das der speicher alle geht und das Objekt einen inkosistenten Zustand annimmt: Ein Objekt für s1 wurde erzeugt, aber löschen kann man es nicht mehr.

    Also wird vorgeschlagen derartige Initialisierungen außerhalb von Konstruktoren , in gewöhnlichen Methoden zu machen.
    Ist das wirklich der beste Weg? Imo "etwas" umständlich.

    1. Außerdem wird gesagt das C++-Exceptions zu viele Ressourcen benötigen (zumindest für die Hardware eines normales Handies):

    Samsung bada uses error results instead of C++ exceptions. C++ exceptions require too large of a runtime for resource-constrained devices and incure too much overhead

    (Fundamentals - Seite 9)
    Ist das wirklich wahr? Ich mein Android setzt auf eine eigene VM (Dalvik VM) und benutzt in dieser Java-Exceptions, und das läuft ebenfalls.



  • Wenn man die Ressourcen nicht wie hier einzeln irgendwie verwaltet, sondern mittels RAII, dann ist das kein Problem, da sich dann alles von selbst aufräumt, wenn eine Exception geworfen wird.

    Ja, exception haben einen gewissen Overhead (wenn sie gewofen werden). Aber wie relevant das ist kommt wahrscheinlich auf die Device an, obwohl ich es mir nur schwer vorstellen kann, dass allzu schlimm sein sollte.



  • Was passiert denn normalerweise wenn nicht genug Speicher zur Vefügung steht?
    Ich dachte eigentlich das dann einfach null zurück gegeben wird und man es somit im Konstruktur bemerken kann um dann s1 wieder zu löschen?!





  • LeggaLasagne schrieb:

    Was passiert denn normalerweise wenn nicht genug Speicher zur Vefügung steht?
    Ich dachte eigentlich das dann einfach null zurück gegeben wird und man es somit im Konstruktur bemerken kann um dann s1 wieder zu löschen?!

    Du müsstest jede Speicheranforderung in einen try/catch Block packen, alles was bisher angelegt wurde (der Speicher des werfenden news wird automatisch freigegeben) wieder löschen und die Ausnahme weiterwerfen, was natürlich sehr aufwendig ist. Die Arbeit kannst du leider nicht den Destruktor machen lassen, weil der für nicht korrekt erzeugte Objekte nihct aufgerufen wird.
    Besser Du packst die Zeiger direkt in sog. smart pointer oder verzichtest möglichst ganz auf dynamische Erzeugung. Was spricht gegen:

    class Blub {
       SomeClass s1,s2;
       public:
          Blub() 
             : s1(),s2()
          {}
    };
    

Anmelden zum Antworten