Avatar billede d34c0n Praktikant
25. juli 2006 - 05:59 Der er 13 kommentarer og
2 løsninger

memory leak?

hejsa..
jeg er i gang med et projekt som har en del parsing.
den kører i en while loop til når der modtages data på en socket.
men det er så ikke her problemet ligger, men at når der modtages en meget lang streng som der parses, crasher programmet.
så ville jeg meget gerne høre hvad dette kan skyldes?
jeg har spurgt mig lidt omkring og har fået at vide det muligvis er en memory leak jeg har. MEN så vidst jeg ved får man kun memory leak ved brug af new operatoren uden at bruge delete, og ved allokering af memory uden at free'e - osv. osv.
men jeg bruger ingen af delene! parseren bruger strstr() og strchr() og strncpy() og så smider den de ting den har fundet, ind i en vector som class type.

help :)
Avatar billede d34c0n Praktikant
25. juli 2006 - 06:03 #1
jeg glemte at tilføje: hvis programmet ikke crasher med det samme, så sker det senere når det har stået og kørt i en del timer. dens cpu forbrug er normalt i starten, men memory forbruget stiger konstant og til sidst crasher programmet.
Avatar billede d34c0n Praktikant
25. juli 2006 - 07:04 #2
det er som om det er tilfældigt om den crasher lige i starten, nogen gange gør den ikke og andre gange gør den. jeg har sat den til at printe tekst ud hvor de forskellige ting sker i parsingen. og programmet crasher her:

printf(">>> Buffers created.\n");

// crash her

tmpa = strstr(receive, "\ny,")+2;
tmpb = strchr(tmpa, '\n');
strncpy(y, tmpa, strlen(tmpa)-strlen(tmpb));

printf(">>> Making buffer ready to get parsed.\n");
Avatar billede d34c0n Praktikant
25. juli 2006 - 07:19 #3
hej hej. ok jeg fandt så den første fejl, det var at tmpb returnerer null sommetider, som jeg ikke vidste.

men jeg har stadig problemet med at den hele tiden stiger i hukommelses forbrug.
Avatar billede segmose Nybegynder
25. juli 2006 - 08:50 #4
Den vector du smider det ind i skal den smide det væk på noget tidspunkt, hvis nej, så vokser den jo bare, hvis ja hvordan smider du det i og hvordan fjerner du det igen, lidt  kode tak.

tmpa og tmpb can begge være NULL men det har du jo set.
Avatar billede d34c0n Praktikant
25. juli 2006 - 09:17 #5
ja det er jeg godt klar over, men vector virker fint, inge problemer der.
det er generelt bare programmet der står og bruger mere og mere memory (også selv om jeg har fjernet alt parsing, så den kun direkte printer rå data).
Avatar billede tokelil Nybegynder
25. juli 2006 - 09:30 #6
Det vil sige du har taget det kode ud hvor du ligger ind i en vector og den stiger stadig?
For du lukker dine sockets når du er færdig med at bruge dem?
Avatar billede segmose Nybegynder
25. juli 2006 - 09:38 #7
Aha, prøv at fjern mere og mere indtil den holder op med at stige, hvis den stadig stiger med kun din socket operation så vis venligst koden for det.
Avatar billede d34c0n Praktikant
25. juli 2006 - 16:28 #8
hej igen. ok nu har jeg fundet ud af hvad der får den til at stige i memory konstant.
jeg har en thread som kører i min while loop:

DWORD WINAPI KeepAlive(LPVOID lpParam)
{
    // -------
    // keep alive funktion
    // sørger for at holde brugeren online

    while (1)
    {
        if (bConnected)
        {
            strcpy(buffer, "g\n");
            client.send((void*)buffer, strlen(buffer));
            memset((void*)buffer, 0, sizeof(buffer));
        }

        Sleep(300000);
    }

    return 0;
}

og inde i min while loop bruger jeg den sådan:

                DWORD dwThreadId, dwThrdParam = 1;
                HANDLE hThread;

                hThread = CreateThread(NULL, 0, KeepAlive, &dwThrdParam, 0, &dwThreadId);
               
                if (hThread != NULL)
                    CloseHandle(hThread);
Avatar billede d34c0n Praktikant
25. juli 2006 - 16:31 #9
hvis jeg ikke bruger thread'en så er memory forbruget helt stabilt.
men jeg kan ikke se hvad der er galt?
Avatar billede tokelil Nybegynder
25. juli 2006 - 16:44 #10
Har du den anden snip kode i dit while loop hvor du laver parsing? Eller misforstår jeg? For så opretter du nye tråde hele tiden? (Du lukker handle, men tråden kører stadig i det uendelige da while(1) {} aldrig forlades...)
Har du kikket på antal tråde i dit program, om det antal bliver ved med at stige?

Btw. hvis buffer er en global variabel eller lign. bør du nok beskytte den med et mutex eller lign.
Avatar billede d34c0n Praktikant
25. juli 2006 - 17:38 #11
ja okay nu har jeg sat den til at starte thread'en lige før min while loop og det har hjulpet på det, men det er som om hver gang koden bliver kaldt så stiger memory forbruget. jeg har ændret lidt i den nu:

    char keepalive[] = "g\n";

    while (1)
    {
        if (bConnected)
            client.send((void*)keepalive, strlen(keepalive));

        Sleep(300000);
    }

er der ikke noget jeg kan gøre for at hindre den i det?
Avatar billede d34c0n Praktikant
25. juli 2006 - 17:47 #12
nej den virker fint nu, det er kun lige éen gang den stiger meget lidt i memory efter at have startet thread'en :) tak for hjælpen. du må lige ligge et svar..
Avatar billede d34c0n Praktikant
25. juli 2006 - 17:47 #13
og segmose lav et svar så kan i splitte points.
Avatar billede tokelil Nybegynder
25. juli 2006 - 18:32 #14
svar
Avatar billede segmose Nybegynder
26. juli 2006 - 09:08 #15
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Cognizant Technology Solutions Denmark ApS

Test Manager

KMD A/S

.NET Developer

Udviklings- og Forenklingsstyrelsen

IT-supporter til stort IT-center i Aalborg