Announcement

Collapse
No announcement yet.

Programm hängt in ~TForm

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Programm hängt in ~TForm

    Hallo Leute,
    ich habe ein Problem mein Programm hängt sich beim beenden regelmässig im destruktor von TForm auf. Fenster ist weg vom Desktop aber im Task-Manager steht das Programm noch mit 100% Auslastung drin. In diesem Programm werden zur Laufzeit Visuelle Object ( new TAbHMeter ) erzeugt und auch vor dem Beenden mit delete gelöscht.

    Mir fällt langsam nicht mehr ein woran das liegen könnte, ideen ?

    C++Builder 5Sp1
    Abakus VCL Componenten.

    Danke.
    Michael

  • #2
    Hallo Michael,

    damit habe ich auch schon oft Probleme gehabt. Vielleicht hilft Dir folgendes weiter:

    1.)
    wo erzeugst Du die Objecte ?
    Meine Erfahrung dazu:
    Objekte die im Destructor gelöscht sollten generell im Konstruktor erzeugt werden und nicht, z.B. im OnCreate Event der Form.
    2.)
    Eventuell kannst Du mal probieren Dein Objekt mit einem auto_ptr zu erzeugen, der ein manuelles delete überflüssig macht

    Gruß
    Gerhar

    Comment


    • #3
      @Gerhard: warum sollen Objekte generell im Konstruktor angelegt werden, es kann genauso gut sein dass sie erst später zur Laufzeit erstellt werden müssen. Man muss im Destruktor nur wissen welche Ojekte man irgendwann angelegt hat.

      @toron: die delete-Anweisungen im Destruktor von TForm kann man sich eigentlich sparen. Das ist zwar aus C++ sicht nicht ganz im korrekt, aber es funktioniert, weil beim Beenden des Programms sowieso der gesamte Speicherplatz der für diesen Prozess reserviert war, wieder freigegeben wird

      Comment


      • #4
        Hallo Leute,

        zuerst einmal Borland sagt dazu: Entweder Konstruktor und Destruktor oder OnCreate() und OnDestroy(). Aber auf gar keinen Fall z.B. OnCreate() und Destruktor verwenden.

        Es werden auch nur die Objekte automatisch freigeben, die von einem VCL-Vorfahren abgeleitet sind. Wenn man eine Klasse ohne Vorfahren im VCL-Stil erzeugt, werden diese auch nicht automatisch freigegeben. Außerdem dachte ich, daß nur die Objekte automatisch freigegeben werden, die mit dem Parameter AOwner erzeugt werden, aber da bin ich nicht sicher.

        Wenn Objekte nicht bereits im Konstruktor erzeugt werden empfiehlt es sich dringendst diese mit NULL zu initialisieren. Auch wenn zur Laufzeit Objekte gelöscht werden sollten diese auf NULL gesetzt werden. Somit kann im Destruktor mit if (Objekt) delete Objekt; sicher stellen, daß auch nur 'lebende' Objekte freigegeben werden.

        Um hier aber eine Aussage treffen zu können, müßtest Du den Destruktor mal posten. Hast Du Dir im Debugger schon mal angesehen, was da passiert? Oder mal einen Haltepunkt auf den ersten Befehl im Destruktor gesetzt und dann zeilenweise abgearbeitet?

        Grüße Joche

        Comment

        Working...
        X