Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL?



  • Hi
    Ich habe eine Reihe Konstruktoren und würde aus diesen gerne einen anderen Konstruktor aufrufen.
    Das ganze funktioniert soweit ja auch, nun setze ich in diesem Konstruktor einen Zeiger auf NULL, damit er nicht versucht ihn im Destruktor zu löschen.
    Naja, machter trotzdem, weil der Zeiger nicht NULL ist.
    Warum ist der Zeiger nicht NULL? Er wird nicht von außerhalb angerührt.
    Ich hab mein Problem mal zur Veranschaulichung vereinfacht:

    class bar
      {
      public:
        bar(int a)
          {
          bar();
          }
        bar() : var(0)
          {
          }
        ~bar()
          {
          if(var != 0)
            delete var;
          }
      private:
        int* var;
      };
    
    int main()
      {
      bar blubb(3);
      }
    

    Ich bekomme also eine Zugriffsverletzung, weil er trotzdem versucht var zu löschen.
    Warum?
    Und warum geschieht das nur wenn ich es aus einem Konstruktor heraus aufrufe, der aus einem Konstruktor heraus aufgerufen wurde?



  • afaik kann man aus einem Konstruktor keinen weiteren Konstruktor aufrufen. Außerdem hat delete von sich aus eine Prüfung gegen NULL, was du da machst, ist also überflüssig 😉



  • Hallo

    class bar
      {
      public:
        bar(int a) : var(0) // Hier muß noch initialisiert werden
          {
          bar(); // Hier wird nicht der Konstruktor für this aufgerufen
          // Sondern ein neues, temporäres Objekt erstellt.
          }
        bar() : var(0)
          {
          }
        ~bar()
          {
    //      if(var != 0) Unnötig weil delete(0) in Ordnung ist
            delete var;
          }
      private:
        int* var;
      };
    
    int main()
      {
      bar blubb(3);
      }
    

    Eventuell solltest du statt den zwei Konstruktoren lieber einen mit einem Default Value für den Parameter verwenden.

    bis bald
    akari



  • Das war ja nur ein Beispiel, in der Anwendung in der das Problem gerade aufgetreten ist handelt es sich um 2 Konstruktoren die beide Parameter annehmen, aber verschiedenen Types.

    Übrigens werden dadurch wirklich beide Konstruktoren aufgerufen und der Debugger sagt auch, dass var kurzzeitig wirklich 0 ist, aber eben nur kurzzeitig, nach dem Aufruf beider KOnstruktoren hat er wieder so einen merkwürdigen Wert der Zugriffsverletzungen hervorruft.

    Was empfehlt ihr dann? Eine gemeinsame Funktion zum NULLsetzen aller Zeiger(und tun was sonst noch so gemeinsames ansteht)? Kam mir ein wenig merkwürdig vor.



  • ne doch, so ist richtig. Die fkt machst du private und rufst sie in den konstruktoren auf, in denen du das nullsetzen würdest.

    Im debugger musst du dann mal im zweiten KOnstruktoraufruf this mit dem this in der übergeordneten konstruktor vergleichen, wirst sehen, ist ein anderes objekt



  • JustAnotherNoob schrieb:

    Übrigens werden dadurch wirklich beide Konstruktoren aufgerufen und der Debugger sagt auch, dass var kurzzeitig wirklich 0 ist, aber eben nur kurzzeitig, nach dem Aufruf beider KOnstruktoren hat er wieder so einen merkwürdigen Wert der Zugriffsverletzungen hervorruft.

    Kurzzeitig, weil nur kurz "var" des temporären Objektes 0 ist. Wie akari schon schrieb, mit "bar();" erstellst du ein neues temporäres Objekt, von dem natürlich auch der Konstruktor aufgerufen wird, und darin (in dem neuen Objekt) ist "var" dann halt 0.
    Du kannst, wenn du mit dem Debugger durchschreitest, ja auch mal den this-Zeiger vergleichen, oder meinetwegen in den Konstruktoren auch ausgeben lassen, dann müsste es klarer werden.


Anmelden zum Antworten