ChrML Skrevet 3. oktober 2004 Del Skrevet 3. oktober 2004 (endret) Jeg skaffa meg MSVC++ i dag, og lagde noen enkle ting for å venne meg til språket og compileren, men siden den egentlige grunnen til at jeg ville ha en bra C++ compiler, er pga Irrlicht, en opensource 3D motor lagd i C++ (noe av det raskeste du får tak i, med super kvalitet) som jeg vil lære meg å bruke. Jeg er ikke akkurat en C++ guru, så jeg lurte på det å frigjøre *char strings, og strukturer. Vil dette lage en memoryleak?: int test(void) { char *test; test = "some string blablablabla"; return 0; //og her slutter vi bare av } Eller må jeg frigjøre den stringe med test = NULL; eller noe? Hva med strukturer?: struct something { int x; }; int test(void) { something testing; testing->x = 50; return 0; } Minneleak der? Bare lurer , litt kjekt å unngå sånne minneleaks i ett spill hvor minne kan være en mangelvare i noen tilfeller. Endret 3. oktober 2004 av chrml Lenke til kommentar
iobas Skrevet 3. oktober 2004 Del Skrevet 3. oktober 2004 (endret) du lager ikke memleaks hvis du ikke allokerer minne, som du ikke har gjort i noen av eksemplene dine. når du har automatiske variabler (int x; er f.eks en automatisk variabel) vil plassen den bruker vil bli deallokert når den går ut av scope. men hvis du har int* x = new int; så blir ikke plassen deallokert når den går ut av scope. bare adressen til minnet hvor du har allokert 4 byte. derfor er det umulig å få tak i den adressen igjen og delete den, og du har en 4 bytes memleak helt til programmet slutter og alt blir deallokert. det første eksempelet ditt hadde også kræsja siden du ikke kan assigne en string literal til en peker. og du har uansett ikke allokert plass til stringen. du kan gjøre char* test = "dette funker"; men da initialiserer du test til å peke på stringliteralen "dette funker" i minnet som er konstant. derfor skal du egentlig skrive const char* test = "dette funker"; en fin huskeregel er "delete what you new, delete[] what you new[]". hvis ikke kan du bruke smartpointere som tar seg hånd om allokering for deg. se smart pointer-seksjonen på www.boost.org Endret 3. oktober 2004 av iobas Lenke til kommentar
ChrML Skrevet 3. oktober 2004 Forfatter Del Skrevet 3. oktober 2004 I see (hadde nok flaks med hvor den stringen i det første eksempelet havna i minnet, lol ). Vil helst ikke bruke classes til strings. MYE treigere, og tar masse minne. Finnes det en måte å ha en dynamisk (men ca like rask) lengde på char arrayen, eller må jeg alltid sette av nok plass, og passe på at jeg ikke går over? Takk for hjelpa! Lenke til kommentar
iobas Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 hadde jeg vært deg hadde jeg brukt std::string. det fører til 10000 ganger mindre feil og er 10000 ganger lettere å bruke. og det går ikke veldig mye saktere. det er vanligvis ikke sånne optimaliseringer man vinner på allikevel. hvis du vil ha dynamisk lengde på char array må du bruke std::string eller lage din egen. Lenke til kommentar
GeirGrusom Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 char *m_string = (char*)malloc(100); strcpy(m_string, "Denne kan maks ha 100 tegn"); printf(m_string); free(m_string); Lenke til kommentar
A_N_K Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 GeirGrusom: Det er ikke akkurat C++ da. Det er ikke den beste framgangsmåten å lære et språk fra bunnen via et forum, så jeg vil anbefale å gå til innkjøp av en bok, f.eks Accelerated C++. Når det gjelder minneforbruket til std::string kan du preallokere med std::string::reserve. Lenke til kommentar
ChrML Skrevet 4. oktober 2004 Forfatter Del Skrevet 4. oktober 2004 (endret) Hehe, vel, jeg har greid å lære andre språk fra bunnen av via forums/internett, så jeg greier vel C++ også . Har seriøst aldri lest programmeringsbøker, men det er nok den raskeste måten, skal se hva jeg har penger til . GeirGrusom: Nice one. Den der skulle funke fint (tenkte ikke på malloc, lol), bortsett fra at den kan bare holde 99 tegn, pga nullen til slutt . Da kan jeg lage noen enkle funksjoner for å lage/endre/free også, som automatisk reallokerer ett nytt sted i minnet, og deallokerer det gamle hvis lengden på stringen skifter (det ville ikke gått mye treigere, eller? er vel på en sånn måte Delphi gjør det). Takker for hjelpa! Endret 4. oktober 2004 av chrml Lenke til kommentar
A_N_K Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 Thinking in C++ er forresten tilgjengelig online, fullstendig gratis. Lenke til kommentar
Alex_2xA Skrevet 26. november 2004 Del Skrevet 26. november 2004 Jeg har holdt på med C++ en stund, men egentlig ikke fått meg meg hva forskjellen på: char *cvar; char cvar ; Kan noen forklare meg det? Hadde vært kjekt Lenke til kommentar
JBlack Skrevet 26. november 2004 Del Skrevet 26. november 2004 Det første er en peker til en char. Den andre er en char. Første brukes gjerne til strenger i C. Pekeren peker da på første bokstav i strengen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå