Results 1 to 11 of 11

Thread: invalid pointer operation bij freeAndNil

  1. #1

    invalid pointer operation bij freeAndNil

    ik heb een object dat heet objProgress (houd voortgang bij)

    wanneer ik dat gebruik en probeer vrij te geven via
    Code:
            if (objProgress <> nil) then
                    freeAndNil(objProgress);
    krijg ik een Invalid pointer operation.
    het mooie is echter : er staat niks in de destructor van TProgress
    Code:
    destructor TProgress.destroy;
    begin
    {        objUpdateTimer.Enabled := false;
            freeAndNil(objLog);
            freeAndNil(objUpdateTimer);
            if (objProgressWindow <> nil) then
                    freeAndNil(objProgressWindow);
    
            inherited;
     }
    end;
    hoe moet ik dit zien ?
    links is niet rechts
    BDS2006 gebruiker

  2. #2
    Ex-Student
    Join Date
    Feb 2004
    Location
    Leeuwarden
    Posts
    2,409
    tsja, ik zou toch denken: objUpdateTimer is niet assigned. Enne... niks is bij jou wel een breed begrip

  3. #3
    ik heb objUpdateTimer helemaal uit de code gesloopt maar de foutmelding blijft
    links is niet rechts
    BDS2006 gebruiker

  4. #4
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    Je hoeft voor het aanroepen van FreeAndNil niet te kijken of de pointer niet toevallig al nil is. FreeAndNil geeft geen foutmelding als de variabele al nil is.

    Wat Cornelis bedoelt is dat wanneer jij de destructor van je highlevel object leeghaalt, er nog steeds heel wat gebeurd. De destructor leeghalen is trouwens niet de goede manier van debuggen. Beter is een breakpoint zetten in de destructor en nagaan of je exception uit de destructor komt.

    Ik vermoed dat je ergens anders al objProgress hebt vrijgegeven (middels Free). De pointer blijft dan wijzen naar het adres waar het object stond. Nog een keer vrijgeven resulteert in dergelijke exceptions. En daar hebben we meteen het verschil tussen Free en FreeAndNil: Free geeft alleen het geheugen vrij, en FreeAndNil zet de pointer ook nog eens op nil.

  5. #5
    En je moet wel inherited; aanroepen in je destructor. Anders heb je ook een bug.

    Verder kan het nog steeds zo zijn dat objProgress al eerder is vrijgegeven of nooit is aangemaakt, maar niet op nil is gezet.
    We adore chaos because we like to restore order - M.C. Escher

  6. #6
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    Ik weet inderdaad ook wel vrij zeker dat je objProgress al ergens is vrijgegeven maar dat de pointer niet genilled is. Vreemd is alleen dat onderstaande code een AV raised en geen EInvalidPointer exception :?

    Code:
    procedure TForm1.btnTestClick(Sender: TObject);
    var
      a, b: TStringList;
    begin
      a := TStringList.Create;
      b := a;
      a.Free;
      FreeAndNil(b);
    end;
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  7. #7
    Omdat bij een Free het geheugen niet leeg geveegt wordt. Je hebt dus een grote kans dat dezelfde structuur nog in het geheugen staat en je de boel nog toevallig kan aanspreken.
    We adore chaos because we like to restore order - M.C. Escher

  8. #8
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    Dat dacht ik ook, maar een simpele test wijst uit dat dat niet helemaal opgaat.

    Dit geeft enkel Access Violations en geen Invalid Pointer errors:

    Code:
    procedure TForm1.btnTestClick(Sender: TObject);
    var
      A: TStringList;
    begin
      Randomize;
      A := Pointer(Random(MaxInt));
      FreeAndNil(A);
    end;

  9. #9
    Welke exceptie gegooid wordt zal wel afhangen van de memory manager die er achter zit. Die van jouw is D7 en die van bengel is D2006 (FastMM)?
    We adore chaos because we like to restore order - M.C. Escher

  10. #10
    Counting your refs Paul-Jan's Avatar
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,160
    Bij een triviaal voorbeeld krijg ik onder Delphi 5 met of zonder FastMM altijd netjes een AV.

    Ik dacht altijd dat je invalid pointer meldingen alleen kreeg wanneer Delphi probeert een dynamische variabele (dynamic array, string, interfaced object) op te ruimen en dan tot de conclusie komt dat de variabele naar een ongeldig adres staat te wijzen. Maar wellicht zit ik er volledig naast.

  11. #11
    ik heb nog steeds niet kunnen achterhalen waar het probleem zit (is nogal een ingewikkeld component), maar het lijkt inderdaad iets met een dynamische array te zijn voor het berekenen van de gemiddelde verstreken tijd per stap. Als ik namelijk de default waarde laag zet, en 'm free, dan invalid pointer. Als ik de default aantal stappen hoog zet, dan is er niets aan de hand.
    links is niet rechts
    BDS2006 gebruiker

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •