Vil dette være ute av omfang og ikke fungere skikkelig?

stemmer
2

Jeg erklære en struct inni min kode og deretter prøver å sette det inn i en datastruktur som jeg har skrevet. Men jeg er bekymret for at siden jeg erklære struct inne i funksjon, når funksjonen avsluttes, datastrukturen vil peke mot søppel. Kan noen hjelpe med dette?

Her er koden:

 void Class::function()
 {
  // do some stuff
  node newNode;
  newNode.memAddr = tempNode.memAddr+totalSize;
  newNode.size = tempNode.size-totalSize;
  lists[newNode.size>=512?64:(newNode.size>>3)].insert(&newNode);
 }

Edit: Jeg er faktisk prøver å omskrive malloc, så ringer malloc () eller ny vil ikke fungere her. Er det noen måte at jeg kunne flytte denne koden inn i innsatsen metode og deretter gjøre det arbeidet på en måte at det ikke ville falle ut av rammen i innsats?

Publisert på 22/04/2009 klokken 01:20
kilden bruker
På andre språk...                            


6 svar

stemmer
3

Det vil være ute av omfanget etter funksjonen returnerer, ja. Det er ikke gyldig. Du ønsker å fordele den på haugen.

Edit: Med mindre du kopierer minnet du peker på i innsats, selvfølgelig.

Svarte 22/04/2009 kl. 01:22
kilden bruker

stemmer
1

newNode vil være ute av omfang, og dens adresse vil peke mot søppel (som jfclavette angitt.)

Men hvis av noen sjanse

 lists[newNode.size>=512?64:(newNode.size>>3)].insert(&newNode)

er iverksatt for å kopiere newNode, så dataene i denne kopien ville trolig være OK, basert på begrenset kodebit at du har lagt ut.

Svarte 22/04/2009 kl. 01:26
kilden bruker

stemmer
1

Dette vil ganske sikkert føre til feil. Problemet er at du sender inn en adresse til en verdi på stakken til en liste som vil leve utover verdien. Hvis listen lagrer node*typer da dette blir feil.

For å få dette til å fungere må du gjøre ett av følgende

  1. Har listen Instance Store nodeverdier i stedet for node*.
  2. Fordele node*på haugen før den sendes i. Dette betyr at du er nødt til å frigjøre det senere.
Svarte 22/04/2009 kl. 01:26
kilden bruker

stemmer
0

Hvorfor er du prøver å implementere malloc? Med mindre du skriver operativsystemet, har du sannsynligvis ikke vil gjøre det. Til syvende og sist må du ringe til OS er heap funksjoner som malloc gjør for deg. Hvis du bare vil ha mer kontroll over hvordan ting er tildelt, se nærmere plassering nytt .

Svarte 22/04/2009 kl. 04:34
kilden bruker

stemmer
0

For å svare på Edit: nei.

Svarte 22/04/2009 kl. 02:00
kilden bruker

stemmer
0

Som andre har nevnt, vil dette resultere i en peker blir lagret som vil peke på stabelen. Stabelen være veldig opptatt, er det svært sannsynlig at det vil peke på noe du bryr deg mye om svært raskt, slik at du finner problemet under kjøring ganske fort.

Bedre å fordele det på haugen (ved hjelp av ny) og allokere det en annen gang.

Edit: fjernet oppmerksom på at "Din kompilatoren skal ha advart deg om å ta adressen til en stabel tildelt objekt (og newNode)." Kompilatoren vil advare deg hvis du prøver å returnere en referanse til en stabel objekt, men ikke hvis du bare prøver å ta en peker.

Svarte 22/04/2009 kl. 01:28
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more