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.