Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Pointterit ja muistinvaraus

Sivun loppuun

Metabolix [07.07.2004 20:31:19]

#

Epävarmuus iski: vapautuuko muisti varmasti?

struct TMenuSelection
// Määritykset välissä
class TGameMenu
{
private:
  TMenuSelection *Selections;
// Muuta tavaraa
}
TGameMenu::TGameMenu(int SelCount)
{
  Selections = new TMenuSelection[SelCount];
  // Muuta koodia
}

// Muut funktiot

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
  TGameMenu *Menu = new TGameMenu(Koko);
  // pääohjelma
  delete Menu;
}

Ymmärrätte varmaankin koodin.
Tuhoutuuko tuo "new TMenuSelection[SelCount]" kun tuhoan Menun? Jos ei, miten saan sen tuhottua?

firebug [07.07.2004 21:42:19]

#

Ei tuhoudu. Lisää vaikka TGameMenun tuhoajaan delete[] Selections niin varattu muisti vapautuu.

Metabolix [07.07.2004 21:55:51]

#

Kiitos. Tuossa vaan hämää se, että niihin viitataan "Selections[Numero]." eikä "Selections[Numero]->"

firebug [07.07.2004 22:33:01]

#

Selections[numero] tarkoittaa siis samaa kuin *(Selections + numero). Voit siis käyttää myös viittausoperaattoria seuraavasti: (Selections + numero)->arvo.

Metabolix [07.07.2004 23:22:00]

#

firebug kirjoitti:

Voit siis käyttää myös viittausoperaattoria seuraavasti: (Selections + numero)->arvo.

Eikös se olisi:
(TMenuSelection *)(Selections + numero * sizeof(TMenuSelection))
Mutta taulukkoa ei käsittääkseni tarvitse tuhota erikseen jos se on määritetty "TMenuSelection Selections[koko]"
Vai tarvitseeko?

tn [07.07.2004 23:45:44]

#

Metabolix kirjoitti:

Eikös se olisi:
(TMenuSelection *)(Selections + numero * sizeof(TMenuSelection))

Sizeofia ei tarvita, sillä kääntäjä tekee sen automaattisesti.

lainaus:

Mutta taulukkoa ei käsittääkseni tarvitse tuhota erikseen jos se on määritetty "TMenuSelection Selections[koko]"
Vai tarvitseeko?

Olet oikeassa, ei tarvitse.

Metabolix [08.07.2004 01:59:27]

#

tn kirjoitti:

Sizeofia ei tarvita, sillä kääntäjä tekee sen automaattisesti.

Tekeekö silloinkin kun osoitetaan vain tiettyyn kohti muistia? Voisinhan minä osoittaa siihen näin:

unsigned long Sijainti = (unsigned long)Selections;
TMenuSelection Kohde = (TMenuSelection *)(Sijainti + numero * sizeof(TMenuSelection));

Miten kääntäjä silloin tietäisi, että osoitan juuri TMenuSelection-taulukkoon??

thefox [08.07.2004 03:09:13]

#

Ei kääntäjä tietenkään tuossa tapauksessa osaa pointteriaritmetiikkaa hoitaa, kun et edes tee operaatiota pointtereille, vaan unsigned long-arvolle :) Jos sen sijaan tekisit näin:

unsigned long Sijainti = (unsigned long)Selections;
TMenuSelection Kohde = ((TMenuSelection *)Sijainti) + numero;

Tietäisi kääntäjä tietysti että Sijainti osoittaa TMenuSelectioniin ja täten osaisi hoitaa aritmetiikan.

Metabolix [08.07.2004 12:58:06]

#

"TMenuSelection Kohde" pitäisi tuossa tietenkin olla
"TMenuSelection *Kohde". Siirrytään suosiolla assemblyyn, niin kääntäjä ei tiedä mistään mitään :D


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta