Toon posts:

[C] Char** free'en

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een explode functie, alleen ik heb een geheugenlek, dat ik maar niet opgelost krijg.
Ik heb namelijk een array met char* die wordt gereturned, en daarna gefree'd.
Alleen als ik de afzonderlijke arrays probeer te free'en krijg ik een error.

Aanroep
C:
1
2
3
4
5
6
7
8
9
10
11
12
    CCharFunctions * m_cCF = new CCharFunctions();
    char tobeexploded[] = "hallo,ik,ben,een,zanger";
    char seps[] = " ,\t\n";
    char ** explode = m_cCF->Explode(seps,tobeexploded, 15);    
    UINT x = _msize(explode)/sizeof(char*);
    for (UINT i=0; i<x;i++)     
        if (explode[i] != NULL)
        {
            printf(explode[i]);
            free(explode[i]);//hier loopt het fout, zonder deze gaat het helemaal goed.
        }
    free(explode);


Functie
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char ** Explode (char * seperator, char * input, int limit = NULL)
{
    if (limit==NULL)
        limit = 1024;
    char **m_cExploded = (char**)malloc(limit*sizeof(char*));
    for (int j = 0; j < limit; j++) m_cExploded[j] = NULL;
    char *token;
    token = strtok(input, seperator);
    int i=0;
    while (token != NULL)
    {

        m_cExploded[i] = (char*)malloc(strlen(token)*sizeof(char));
        strcpy(m_cExploded[i],token);
        printf( "%s\n", m_cExploded[i]);
        i++;
        token = strtok( NULL, seperator);
    }
    return m_cExploded;
}


Output
code:
1
2
3
4
5
6
hallo
ik
ben
een
zanger
halloPress any key to continue


Hij gaat dus bij het eerste stukje (explode[0]) al fout, terwijl hij niet null is. Weet iemand hoe dit kan, en wat de oplossing kan zijn, want als ik de ene regel weg haal werkt het allemaal.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

• Kijk eens naar 'calloc' voor die allocaties, je maakt er nu een soepzooi van :)
• _msize is niet portable, geef aantal allocated tokens gewoon by-ref of by-pointer terug in die limit
• En de knaller: je vergeet een trailing zero te alloceren in de chararrays. Hierdoor krijg je buffer overruns die de toko corrupten bij vrijgave (of eerder).

Al eens naar vector<std::string> gekeken overigens? :)

[ Voor 3% gewijzigd door curry684 op 05-01-2004 11:57 . Reden: html-rechten :r ]

Professionele website nodig?


Verwijderd

Topicstarter
He, het was inderdaad de trailing zero ('\0'). Een +1 zorgde er voor dat dat probleem werd opgelost.
Hardstikke bedankt, deze mag wel opslot ;).

(misschien handig):
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    char ** Explode (char * seperator, char * input, int limit = NULL)
    {
        if (limit==NULL) limit = 1024;
        char **m_cExploded = (char**)calloc(limit, sizeof(char*));
        char *token;
        token = strtok(input, seperator);
        int i=0;
        while (token != NULL)
        {
            m_cExploded[i] = (char*)malloc((strlen(token)+1)*sizeof(char));
            strcpy(m_cExploded[i],token);
            printf( "%s\n", m_cExploded[i]);
            i++;
            token = strtok( NULL, seperator);
        }
        return m_cExploded;
    }

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 05 januari 2004 @ 13:08:
Hardstikke bedankt, deze mag wel opslot ;)
Geen probleem, maarreh we zetten geen topics op slot als het onderhevige probleem opgelost is: wellicht hebben andere mensen nog input/meningen/discussiepunten, enne...
(misschien handig)
Zoals je zelf al aangeeft met die code is dit topic wellicht nuttig voor het nageslacht, echter de meeste mensen negeren gesloten topics in de search (en daar modereren we ook op). Ergo, tenzij een topic niet P&W-waardig is gaat ie nooit op slot :)

Professionele website nodig?


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
offtopic:
Nouja, dan zou ik in ieder geval de topictitel veranderen naar C ipv C++ want een mooite C++ oplossing zie ik hier niet in

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
Glimi schreef op 05 januari 2004 @ 13:17:
offtopic:
Nouja, dan zou ik in ieder geval de topictitel veranderen naar C ipv C++ want een mooite C++ oplossing zie ik hier niet in
vind ik ook:
Als je C++ gebruikt, gebruik dan new/delete en new[]/delete[], en geen malloc/calloc/realloc/free.

en string,...

[ Voor 21% gewijzigd door schoene op 05-01-2004 13:32 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Sterker nog, gezien het feit dat ie overal [code=c] gebruikt was dat denk ik ook de bedoeling, renamed dus :)

Professionele website nodig?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
ja, maar op zn eerste regel staat wel

C++:
1
CCharFunctions * m_cCF = new CCharFunctions();


en dat is nog steeds C++ bij mijn weten?

[ Voor 4% gewijzigd door schoene op 05-01-2004 15:56 ]


Verwijderd

hmm misschien is dit een persoonlijk iets, maar ik vind in C++ altijd dat degene die een blok geheugen alloceert het ook weer vrij moet geven... Daarmee voorkom je allerlei memory leaks al in je design phase.

std::autoptr doet ook wonderen ;) alhoewel je voor strings zoals al vermeld natuurlijk std::string kunt gebruiken
Pagina: 1