1

Onderwerp: Valgrind vraagje

Ik het een gelinkte lijst. laten we zeggen iets zoals dit

typedef struct pascal_type
{
    char *naam;
   char *value;
  struct pascal_type *Next;
} pascal_type;

Daar zet ik wat gegevens in, ongeveer op de volgende manier

   pascal_type *lijst=null;

  while(doe een paar keer)
  {
     pascal_type *pascal;
     pascal = malloc(sizeof(pascal_type));
     pascal->naam=malloc(7);
    strcpy(pascal->naam("pascal");
    pascal->value=malloc(5);
    strcpy(pascal->value,"cool");
    pascan->Next=NULL;

    if(lijst==NULL)
        lijst=pascal;
   else
   {
          pascal_struc *Next=lijst->Next;
          while(Next->Next!=NULL)
             Next=Next->Next;
         Next->Next=pascal;
    }
}

Niets bijzonders gewoon een gelinkte lijst dus.
Voor het opruimen van de rommel heb ik een functie die recursief alles netjes vrijgeeft.
Ik pas dit erg veel toe in een project waar ik nu mee bezig ben en het werk prima.

Nu ja wat heet... op een HP-UX systeem krijg ik continu seg faults bij het alloceren van geheugen.
Daarom dus maar ens met valgrind aan de gang gegaan.

Van die gelinkte lijste concludeerd valgrind dat het gealoceerde geheugen defenitely lost is
==24971== 2 bytes in 1 blocks are definitely lost in loss record 9 of 150
==24971==    at 0x4C277AB: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so).

Nu begrijp ik dat tot op zekere hoogte wel.
Immers ik assign geheugen aan een variabele (een pointer), en hevel dit daarna over naar een andere variabele.
Zonder echt te weten wat ik doe is het voor valgrind nauwelijks te beoordelen of ik de zaak goed bij houd.

Vraag is dus, klopt het dat valgrind in deze beperkingen heeft en dat mijn geheugen beheer waarschijnlijk gewoon correct verloopt ?

params waarmee ik valgrind opstart zijn de volgende
--leak-check=full --track-origins=yes --show-reachable=yes

Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd

Re: Valgrind vraagje

Immers ik assign geheugen aan een variabele (een pointer), en hevel dit daarna over naar een andere variabele.

Dit is voor valgrind geen probleem. Het kijkt niet of je free aanroept op dezelfde variabele, maar houdt per allocatie bij of het al ge-free()d is. Dus het weet uiteindelijk of een allocatie ooit ge-free()d is, maar kan om dezelfde reden ook double-free()s detecteren. Als de korte stacktrace aangeeft dat die malloc() plaats heeft gevonden in jouw code, dan is het jouw lek wink.

3

Re: Valgrind vraagje

Hmmm klink als 'GarbageCollection by count'
We zoeken verder.
Ik krijg allerlij onverklaarbare segfaults bij het alloceren van geheugen.
gewoon iets als   char *a=malloc(5000);    lijkt ineens fout te gaan.
Nu wil ik wel geloven dat ik uit het geheugen loop (al is dat nogal onwaarschijnlijk) maar een malloc die failt moet een NULL terug geven, geen segfault wink

Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd