Frysning Skrevet 4. juni 2007 Del Skrevet 4. juni 2007 (endret) Hei! Et HelloWorld program i GTK som er OOP basert må allokere minne for GtK::Window vindu, mitt spørsmål er. Hvordan kalkuleres minnebruket og hvilken funksjon returnerer egentlig adressen jeg kan finne ved å lage en pointer som dette: Gtk::Window* vindu = Gtk::manage(new Gtk::Button); New er jo et keyword, men det kaller vel bare construktoren til klassen Button? Eller kanskje baseclasen sin conctructor. Takk for litt input iallefall, eventuelt linker. Vanligvis funker google, men jeg er tom for søkeord som guider meg inn på rett side. Tusen takk for hjelp! Edit: Tipper jeg må grave i headerfilene eller noe, kanskje lese om malloc? Er det den som brukes? Endret 4. juni 2007 av rat911 Lenke til kommentar
Giddion Skrevet 5. juni 2007 Del Skrevet 5. juni 2007 Hei! Et HelloWorld program i GTK som er OOP basert må allokere minne for GtK::Window vindu, mitt spørsmål er. Hvordan kalkuleres minnebruket og hvilken funksjon returnerer egentlig adressen jeg kan finne ved å lage en pointer som dette: 8784979[/snapback] ikke at jeg vet helt hvordan Gtk fungerer, men det virker som om du sender en peker til Gtk::Button til Gtk::manage som igjen gjør noe og så returnerer en Gtk::Window peker. Så Gtk::Window pekeren kommer fra Gtk::manage() selve størelsen kan beregnes ved bruk av sizeof(), men hvis konstruktøren også allokerer noe så vil ikke sizeof() gi riktig svar siden f. eks. en peker som peker til en 1kB buffer bare vil leses som 4B siden det er størrelsen på pekeren. Gtk::Window* vindu = Gtk::manage(new Gtk::Button); New er jo et keyword, men det kaller vel bare construktoren til klassen Button? Eller kanskje baseclasen sin conctructor. 8784979[/snapback] new allokerer minne og kjører construktoren til klassen med utgangspunkt i det allokerte området så returneres en peker til det nye området. Edit: Tipper jeg må grave i headerfilene eller noe, kanskje lese om malloc? Er det den som brukes? 8784979[/snapback] det er new som burde brukes i c++, men det er sikkert mye av det samme prinsippet i malloc. håper dette hjalp litt. Lenke til kommentar
Dead_Rabbit Skrevet 5. juni 2007 Del Skrevet 5. juni 2007 new-operatoren allokerer minne, initialiserer det og returnerer en peker. Dette er til forskjell fra malloc som bare returnerer "raw memory" (void*). Gtk::Window* vindu = Gtk::manage(new Gtk::Button); I dette eksempelet betyr det at du sender en peker til en nylig allokert Gtk::Button til Gtk::manage. Gtk::manage gjør at GTK styrer levetiden til objektet, og at du slipper å delete pekeren selv: http://www.gtkmm.org/docs/gtkmm-2.4/docs/t.../html/ch22.html Lenke til kommentar
Frysning Skrevet 5. juni 2007 Forfatter Del Skrevet 5. juni 2007 (endret) Men hvis man kaller kun new: new(); Hvordan vet den hvor mye minne den skal allokere? Har dette med data-typen/objecte man skriver etter new? Return må jo være start og stopp, eller bare start + størrelse på object? Kan jeg bruke malloc altså? Den returnerer hva da? Område? Endret 5. juni 2007 av rat911 Lenke til kommentar
Giddion Skrevet 5. juni 2007 Del Skrevet 5. juni 2007 Men hvis man kaller kun new: new(); 8788075[/snapback] new er jo et keyword og ikke en funksjon så du kan ikke skrive new(); uten å få feil under kompileringen. Hvordan vet den hvor mye minne den skal allokere? Har dette med data-typen/objecte man skriver etter new? 8788075[/snapback] stemmer. new bruker noe ala sizeof() for å finne ut hvor mye den må allokerer. Return må jo være start og stopp, eller bare start + størrelse på object? 8788075[/snapback] du spør om å få f. eks. 2000Byte og så returneres en peker til et området som er garantert å være 2000B (hvis alt går bra). Kan jeg bruke malloc altså? Den returnerer hva da? Område? 8788075[/snapback] malloc er laget for C, men du kan jo bruke den i c++ også. void *malloc( size_t size ); size er størrelsen på området du vil ha. malloc returnerer en peker til området eller NULL hvis noe gikk galt. f. eks. allokerer en array av 10 stk. int Klikk for å se/fjerne innholdet nedenfor #include <malloc.h> int main() { int* pIntArray; pIntArray = (int*)malloc(sizeof(int) * 10); free(pIntArray);//deallokerer minne; return 0; } En siste til med malloc og new: Når du bruker new til å allokerer må du bruke delete. og ved bruk av malloc må du bruke free. Så du kan ikke allokere med new og deallokere med free. Det er også viktig at du holder deg innenfor området ditt. Hvis du allokerer 10byte så må du aldri under noen omstendigheter skrive 11byte dette kan skape feil som er så utrolig vanskelig å finne (ja jeg vet ). Lenke til kommentar
Frysning Skrevet 6. juni 2007 Forfatter Del Skrevet 6. juni 2007 Hvor mye holder hver adresse da? Når malloc returnerer en pointer til et område som er på 2000, skriver jeg da 2000 til den adressen? Eller stiger adressen for hver hva? Lenke til kommentar
Jaffe Skrevet 7. juni 2007 Del Skrevet 7. juni 2007 (endret) Hvor mye holder hver adresse da?Når malloc returnerer en pointer til et område som er på 2000, skriver jeg da 2000 til den adressen? Eller stiger adressen for hver hva? 8801869[/snapback] Hva mener du nå? malloc/new returnerer en peker som du da kan bruke til å lagre/hente data i det nye området. Da bruker du vanlige pekere-aritmetiske operasjoner for å "sette" pekeren til den adressen du vil. Hvis du ikke kan stort om pekere: http://www.cplusplus.com/doc/tutorial/pointers.html Husk den generelle regelen at * foran en peker brukes til å referere til det den peker til, mens pekeren i seg selv refererer til adressen. Jeg kan ta et totalt ubrukelig eksempel der vi itererer over et allokert område og setter hvert tall fra 0 til 19, og deretter printer ut adressen og verdien som er lagret der: CODE #include <stdio.h> #include <stdlib.h> int main(void) { // Opprett to pekere (p1 og p2) og alloker minne for 20 tall int* p1 = malloc(4 * 20); // p1 = adresse til området int* p2 = p1; // p2 skal vi bruke til å iterere over minneområdet int i; for (i = 0; i < 20; i++) *p2++ = i; // innholdet i minnet med adressen til p2 = i, øk adressen p2 = p1; // sett p2 tilbake til starten av området for (i = 0; i < 20; i++) printf("%x: %d\n", p2, *p2++); // iterer over området og print adressen // og innholdet free(p1); // frigjør området p1 peker til system("pause"); } Endret 7. juni 2007 av Jaffe Lenke til kommentar
Frysning Skrevet 7. juni 2007 Forfatter Del Skrevet 7. juni 2007 Takk... Det var et eksempel som forklarte det jeg lurte på iallefall. 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å