reference count



  • void test()
    {
      myclass a;
      ...
    }
    

    Bei dem Code oben würde ich ein Objekt myclass erzeugen. Ich könnte nun Pointer auf diese Klasse setzten... in dem Fall sollte ich wohl auch mit reference count arbeiten... Wenn nun die Funktion beendet wird, dann existiert das Objekt nicht und alle Pointer sind dann fehlerhaft - also nützt da refrence count nix...

    void test()
    {
      myclass* a=new myclass;
      ...
    }
    

    Hiermit würde ich das Problem lösen... aber! a kann nun im gegensatz zum oberen code 0 sein - weswegen sowas wie a->callfunc() zu fehlern führen würde - und ich jedes mal prüfen muss...

    Wer kann mir Tipp geben wie ich es machen soll - oder welche der oberen Methoden die bessere ist?

    Wenn ich es ohne OOP mache - also etwa so wie unten, dann muß ich nicht 100x prüfen ob a 0 ist, da ich es in der Funktion mache.

    void myclass_callfunc(myclass* a)
    {
    if (a==0) return;
    ...
    }
    


  • Ich verstehe deinen Beitrag nicht, wofür du jetzt "reference count" einsetzen willst?

    Wenn "myclass* a=new myclass;" fehlschlägt, dann kriegst du eine Exception "std::bad_alloc" und aus die Maus!
    Der Code danach würde dann gar nicht mehr abgearbeitet und du brauchst deswegen auch nicht auf 0 zu testen.

    Beschreib mal dein eigentliches Problem...



  • Da du bei jedem Aufruf von test() ein neues Objekt erzeugst, muss du die Pointer darauf auch dementsprechend verwalten. Am besten im einer Liste oder einem Vector (std vector class).

    void test()
    {
      myclass* a=new myclass;
      ...
    }
    

    Damit kannst du ja eh nicht mehr, nach beenden der Funktion, auf a zugreifen.
    Oder du sicherst einfach, dass du immer ein valides Objekt hast:

    // Rueckgabe ist ein Pointer auf das erzeugte Objekt
    myclass *test()
    {
        myclass *a = new myclass;
        ... // weiterer Code
        return a;
    }
    
    ... // weiterer Code
    
        myclass *p_my_object;
    
        // die naechsten Zeilen koennen auch in einer Schleife stehen
         p_my_object = test();
         ... // mit dem Objekt arbeiten...
         delete p_my_object;
        //
    
        ... // weiterer Code
    

Anmelden zum Antworten