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?
Ei tuhoudu. Lisää vaikka TGameMenun tuhoajaan delete[] Selections niin varattu muisti vapautuu.
Kiitos. Tuossa vaan hämää se, että niihin viitataan "Selections[Numero]." eikä "Selections[Numero]->"
Selections[numero] tarkoittaa siis samaa kuin *(Selections + numero). Voit siis käyttää myös viittausoperaattoria seuraavasti: (Selections + numero)->arvo.
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?
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.
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??
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.
"TMenuSelection Kohde" pitäisi tuossa tietenkin olla
"TMenuSelection *Kohde". Siirrytään suosiolla assemblyyn, niin kääntäjä ei tiedä mistään mitään :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.