Avatar billede brian8 Nybegynder
08. marts 2003 - 10:17 Der er 9 kommentarer og
2 løsninger

Hvad er forskelle på at man bruger new og ikke bruger den???

Jeg mener at når man f.eks. skriver Konto k = new Konto() i c++ så ligges k på stakken og selve konto-objektet på heapen. Er dette korekt? Hvad nu hvis man kun skriver Konto k; hvordan ser det så ud nede i heapen og stakken?
Avatar billede mufoxe Nybegynder
08. marts 2003 - 10:33 #1
Konto k; er blot en erklæring af variablen. Der vil ikke blive allokeret hukommelse til objektet før det instansieres ved brug af new operatoren.
Avatar billede soreno Praktikant
08. marts 2003 - 10:36 #2
Avatar billede soreno Praktikant
08. marts 2003 - 10:39 #3
mufoxe >> Ehhh, det er jeg ikke enig med dig i.
Når man skriver:
Konto k = new Konto();
Allokeres memory til et Konto objekt på heapen. Memory deallokeres ikke før der kaldes:
delete k;

Når man skriver:
Konto k;
Allokeres memory til et Konto objekt på stakken. Memory deallokeres når k går uden for scope.
Avatar billede arne_v Ekspert
08. marts 2003 - 10:40 #4
Konto k = new Konto();

allokerer en pointer på stakken og en sizeof(Konto)+overhead på heapen,
pointeren pegher på objektet i heapen

Konto k;

inde i metode/function: allokerer en pointer på stakken uden at initialisere den

udenfor: sætter plads af til pointer i segment (ca. det samme som heap)
uden at initialisere den
Avatar billede arne_v Ekspert
08. marts 2003 - 10:42 #5
Hov Søren har ret. Der mangler nogle *'er !

Konto *k = new Konto();

allokerer en pointer på stakken og en sizeof(Konto)+overhead på heapen,
pointeren pegher på objektet i heapen

Konto *k;

inde i metode/function: allokerer en pointer på stakken uden at initialisere den

udenfor: sætter plads af til pointer i segment (ca. det samme som heap)
uden at initialisere den

Konto k = new Konto();

er ikke valid C++

Konto k;

inde i metode/function: allokerer et object på stakken

udenfor: sætter plads af til et objektp i segment (ca. det samme som heap)
Avatar billede arne_v Ekspert
08. marts 2003 - 11:54 #6
"ikke valid C++" skal tages med lidt forbehold, hvis der
er defineret en assignment operator for pointer tilKonto, så
er det naturligvis OK.
Avatar billede tosssen Nybegynder
08. marts 2003 - 13:53 #7
umiddelbart minder Konto k = new Konto(); mistænkeligt meget om java kode ;-)
Avatar billede soreno Praktikant
08. marts 2003 - 14:06 #8
Ja, jeg havde også blandet dem sammen. Men så er det jo rart at Arne kan gøre rede for hvad der egentlig sker.
:-)
Avatar billede brian8 Nybegynder
09. marts 2003 - 14:57 #9
Skal lige hører om jeg har forstået det ret. (Konto k;) nu er der allokeret plads på stakken til kontoen. (k.indsaet(100)); nu er konto-objektet oprettet på den allokerede plads på stakken, og 100kr. er blevet indsat. Og dette kan jeg også bare gøre ved at sige: (Konto k(100)); Er dette forstået rigtigt :)
Avatar billede brian8 Nybegynder
09. marts 2003 - 15:01 #10
Jeg bør nok lige sige at jeg har forstået (Konto *k = new Konto();) Men har også set Konto k; og så k.indsaet(100); og det er det som jeg ikke kan gennemskue på stack/pointer niveau.
Avatar billede segmose Nybegynder
09. marts 2003 - 15:22 #11
Pointerne er en adresse og kan være global, heap eller stack.

Globale data:
Generelt data der er defineret uden for funktioner/metoder. Frigives først ved programmets afslutning.

Heap:
Her allockeres generelt med new, new kan dog være defineret til noget andet
da new kan overloades. Frigives af programmet, herunder af destructore der destruere objecter det tidligere har allockeret fra heap med new.

Stack:Alle data der defineres i funktioner/metoder, disse frigives når fnktionen / metoden forlades og diverse destructore kaldes som kan frigive på heap.
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