http://wiki.math.bme.hu/history/Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles?feed=atom&Informatika2-2015/Eloadas 12 C-5 Memoria kezeles - Laptörténet2024-03-29T12:59:01ZAz oldal laptörténete a wikibenMediaWiki 1.18.1http://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10729&oldid=prevCsirke, 2015. április 29., 14:19-n2015-04-29T14:19:52Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">←Régebbi változat</td>
<td colspan='2' style="background-color: white; color:black;">A lap 2015. április 29., 14:19-kori változata</td>
</tr><tr><td colspan="2" class="diff-lineno">88. sor:</td>
<td colspan="2" class="diff-lineno">88. sor:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div><python></div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div><python></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>def iedik_fajl(<del class="diffchange diffchange-inline">n</del>):</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>def iedik_fajl(<ins class="diffchange diffchange-inline">i</ins>):</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>     fajlnev = "adatok_{}.txt" % <del class="diffchange diffchange-inline">n</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>     fajlnev = "adatok_{}.txt" % <ins class="diffchange diffchange-inline">i</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     fajl = open(fajlnev, "w")</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     fajl = open(fajlnev, "w")</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     return fajl</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     return fajl</div></td></tr>
</table>Csirkehttp://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10728&oldid=prevCsirke, 2015. április 29., 14:18-n2015-04-29T14:18:48Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">←Régebbi változat</td>
<td colspan='2' style="background-color: white; color:black;">A lap 2015. április 29., 14:18-kori változata</td>
</tr><tr><td colspan="2" class="diff-lineno">286. sor:</td>
<td colspan="2" class="diff-lineno">286. sor:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Ezzel a megoldással nincsen technikai probléma, működik, és eleinte valószínűleg gyorsabb is mint az eredeti megoldás. Azonban, azzal hogy ezeket a beolvasott adatokat a végtelenségig eltárolja, egyre több memóriát foglal, annak ellenére, hogy a fájlok többségét nem kell többször feldolgozni. Ha gyorsítani akarunk, akkor ahhoz érdemesebb lenne valami bonyolultabb megoldást alkotni, ami mondjuk egy óra után elfelejti a beolvasott fájlokat, vagy maximum 10 fájl adatait tárolja le, mert ez így nem fenntartható viselkedés.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Ezzel a megoldással nincsen technikai probléma, működik, és eleinte valószínűleg gyorsabb is mint az eredeti megoldás. Azonban, azzal hogy ezeket a beolvasott adatokat a végtelenségig eltárolja, egyre több memóriát foglal, annak ellenére, hogy a fájlok többségét nem kell többször feldolgozni. Ha gyorsítani akarunk, akkor ahhoz érdemesebb lenne valami bonyolultabb megoldást alkotni, ami mondjuk egy óra után elfelejti a beolvasott fájlokat, vagy maximum 10 fájl adatait tárolja le, mert ez így nem fenntartható viselkedés.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del style="color: red; font-weight: bold; text-decoration: none;"></del></div></td><td colspan="2"> </td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del style="color: red; font-weight: bold; text-decoration: none;">=== Felszabadított memória használata ===</del></div></td><td colspan="2"> </td></tr>
</table>Csirkehttp://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10716&oldid=prevCsirke, 2015. április 29., 11:15-n2015-04-29T11:15:21Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">←Régebbi változat</td>
<td colspan='2' style="background-color: white; color:black;">A lap 2015. április 29., 11:15-kori változata</td>
</tr><tr><td colspan="2" class="diff-lineno">198. sor:</td>
<td colspan="2" class="diff-lineno">198. sor:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Figyeltem a kód megírása közben, hogy amikor átméretezem, akkor a régi adatot mindig felszabadítsam. Ennél a tömbnél a helyes használat átméretezni 0-ra amikor befejeztük a használatát, mert az felszabadítja a belső adattárolót. Az, hogy a ValtozoTomb struktúra megsemmisül a blokk végén, az nem jelenti alapból azt hogy a benne levő adattároló is felszabadul, csak ha direkt felszabadítjuk így.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Figyeltem a kód megírása közben, hogy amikor átméretezem, akkor a régi adatot mindig felszabadítsam. Ennél a tömbnél a helyes használat átméretezni 0-ra amikor befejeztük a használatát, mert az felszabadítja a belső adattárolót. Az, hogy a ValtozoTomb struktúra megsemmisül a blokk végén, az nem jelenti alapból azt hogy a benne levő adattároló is felszabadul, csak ha direkt felszabadítjuk így.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>=== <del class="diffchange diffchange-inline">Láncolt lista? </del>===</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>=== <ins class="diffchange diffchange-inline">"->" (nyíl) operátor </ins>===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">A láncolt lista egy népszerű módszer adatok tárolására. Valahogy így néz ki:</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">Itt az előző példában sokszor láthattuk azt, hogy "</ins><<ins class="diffchange diffchange-inline">code</ins>><ins class="diffchange diffchange-inline">(</ins>*<ins class="diffchange diffchange-inline">tomb).meret</code>" és "<code></ins>(<ins class="diffchange diffchange-inline">*tomb</ins>)<ins class="diffchange diffchange-inline">.adat</ins></<ins class="diffchange diffchange-inline">code</ins>><ins class="diffchange diffchange-inline">", amik kicsit csúnyán és bonyolultan néznek ki. Általában sokszor előfordul a </ins>C<ins class="diffchange diffchange-inline">-ben, hogy valamilyen struktúra elemeit egy, a struktúrára mutató mutatón keresztül szeretnénk elérni. Ezért erre van speciális szintaxis, és ahelyett hogy "<code>(*tomb).meret</code>", írhatom azt hogy "<code>tomb->meret</code>"</ins>.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div> </div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">c</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">struct ListaElem {</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">    int data;</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">    struct ListaElem </del>*<del class="diffchange diffchange-inline">next;</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">}</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div> </div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">int main</del>() <del class="diffchange diffchange-inline">{</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div> </div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">}</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">c</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div> </div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">[Fájl:</del>C <del class="diffchange diffchange-inline">lancolt lista</del>.<del class="diffchange diffchange-inline">png]</del></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>== Automatikus vs. manuális memóriakezelés ==</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>== Automatikus vs. manuális memóriakezelés ==</div></td></tr>
</table>Csirkehttp://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10715&oldid=prevCsirke, 2015. április 29., 11:06-n2015-04-29T11:06:05Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">←Régebbi változat</td>
<td colspan='2' style="background-color: white; color:black;">A lap 2015. április 29., 11:06-kori változata</td>
</tr><tr><td colspan="2" class="diff-lineno">199. sor:</td>
<td colspan="2" class="diff-lineno">199. sor:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Láncolt lista? ===</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Láncolt lista? ===</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">A láncolt lista egy népszerű módszer adatok tárolására. Valahogy így néz ki:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"><c></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">struct ListaElem {</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    int data;</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    struct ListaElem *next;</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">}</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">int main() {</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">}</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></c></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[Fájl:C lancolt lista.png]</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>== Automatikus vs. manuális memóriakezelés ==</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>== Automatikus vs. manuális memóriakezelés ==</div></td></tr>
<tr><td colspan="2" class="diff-lineno">204. sor:</td>
<td colspan="2" class="diff-lineno">219. sor:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Hogy működik az automatikus memóriakezelés? ===</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Hogy működik az automatikus memóriakezelés? ===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline">A python interpreter ugyan felszabadítja idővel </del>a <del class="diffchange diffchange-inline">fölösleges memóriát</del>, <del class="diffchange diffchange-inline">de tényleg csak idővel</del>, <del class="diffchange diffchange-inline">így </del>a <del class="diffchange diffchange-inline">program folyamatosan több memóriát használ mint feltétlenül szükséges</del>. <del class="diffchange diffchange-inline">(Plusz</del>, <del class="diffchange diffchange-inline">eleve az automatikus memóriakezelés megvalósításához plusz memóriára van szükség az interpreterben, mielőtt </del>a <del class="diffchange diffchange-inline">mi programunk akár elindult volna</del>.<del class="diffchange diffchange-inline">) Aztán időnként lefut az interpreterben az </del>a <del class="diffchange diffchange-inline">folyamat</del>, <del class="diffchange diffchange-inline">amit </del>'''<del class="diffchange diffchange-inline">szemét gyűjtés</del>'''<del class="diffchange diffchange-inline">nek hívnak</del>, <del class="diffchange diffchange-inline">amikor kidob mindent ami már </del>nem kell, <del class="diffchange diffchange-inline">azonban </del>ez a <del class="diffchange diffchange-inline">folyamat bizonytalan </del>hogy <del class="diffchange diffchange-inline">mennyi ideig tart</del>, és <del class="diffchange diffchange-inline">kb</del>. <del class="diffchange diffchange-inline">bármikor lefuthat</del>, <del class="diffchange diffchange-inline">így ha </del>a <del class="diffchange diffchange-inline">programunknak azonnal kell tudnia reagálni</del>, <del class="diffchange diffchange-inline">akkor megengedhetetlen </del>hogy <del class="diffchange diffchange-inline">közben lefusson </del>egy <del class="diffchange diffchange-inline">szemétgyűjtés</del>, <del class="diffchange diffchange-inline">python</del>-<del class="diffchange diffchange-inline">ban viszont ezt </del>nem <del class="diffchange diffchange-inline">lehet megakadályozni</del>.</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">Most, hogy részletesen tárgyaltuk, hogy hogy működik </ins>a <ins class="diffchange diffchange-inline">memóriakezelés a C-ben</ins>, <ins class="diffchange diffchange-inline">teszek egy rövid kitérőt</ins>, <ins class="diffchange diffchange-inline">hogy </ins>a <ins class="diffchange diffchange-inline">python, és más hasonló nyelvek működéséről adjak egy rövid összefoglalót</ins>. <ins class="diffchange diffchange-inline">Továbbra is azt a problémát kell megoldani</ins>, <ins class="diffchange diffchange-inline">hogy </ins>a <ins class="diffchange diffchange-inline">programozó lefoglalhat a memóriából memóriablokkokat, és azokat fel kell szabadítani, ha már nincsenek használatban</ins>. <ins class="diffchange diffchange-inline">Bár itt </ins>a <ins class="diffchange diffchange-inline">memória foglalása közvetett</ins>, <ins class="diffchange diffchange-inline">és nem látszik első ránézésre, hogy pontosan mikor történik új memória foglalása, de attól még erről van szó.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">A legtöbb automatikus memóriakezelő rendszer az úgynevezett </ins>'''<ins class="diffchange diffchange-inline">szemétgyűjtés</ins>''' <ins class="diffchange diffchange-inline">(garbage collection) módszert használja. A megoldás fontos eleme</ins>, <ins class="diffchange diffchange-inline">hogy </ins>nem kell <ins class="diffchange diffchange-inline">azonnal felszabadítani a memóriablokkot az utolsó használat után</ins>, <ins class="diffchange diffchange-inline">hanem ráér később is. A szemétgyűjtő program (a python esetében </ins>ez <ins class="diffchange diffchange-inline">az interpreter egy része) számontart minden memóriablokkot ami le lett foglalva. Ezen kívül, </ins>a <ins class="diffchange diffchange-inline">szemétgyűjtő program tudja ellenőrizni, </ins>hogy <ins class="diffchange diffchange-inline">milyen változók léteznek a programban</ins>, és <ins class="diffchange diffchange-inline">azok mely memóriablokkokra mutatnak</ins>.</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">Bizonyos rendszerességgel</ins>, a <ins class="diffchange diffchange-inline">program elvégzi a szemét gyűjtését, és kiválogatja</ins>, hogy <ins class="diffchange diffchange-inline">melyik memóriablokkokra van szükség, melyekre nincs. Ez nem olyan egyszerű, hogy csak azt ellenőrzi, hogy melyikekre mutat még változó, mert az egyik memóriablokk is mutathat a másikra, mint láthattuk amikor </ins>egy <ins class="diffchange diffchange-inline">listán belül tároltunk egy másik listát.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline"><wikiframe width="950" height="600" frameborder="1" src="http://pythontutor.com/iframe-embed.html#code=fa+%3D+%5B%5B%5B1%5D</ins>,<ins class="diffchange diffchange-inline">+%5B2%5D,+%5B3%5D%5D,+%5B%5B4%5D,+%5B5%5D%5D%5D%0A%0Aprint+fa%0A%0Ajobb_ag+%3D+fa%5B1%5D%0Adel+fa%5B1%5D%0Afa%5B0%5D.append(jobb_ag)%0A%0Aprint+fa&origin=opt</ins>-<ins class="diffchange diffchange-inline">frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=2&rawInputLstJSON=%5B%5D&curInstr=1&codeDivWidth=350&codeDivHeight=400"/></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">[http://pythontutor.com/visualize.html#code=fa+%3D+%5B%5B%5B1%5D,+%5B2%5D,+%5B3%5D%5D,+%5B%5B4%5D,+%5B5%5D%5D%5D%0A%0Aprint+fa%0A%0Ajobb_ag+%3D+fa%5B1%5D%0Adel+fa%5B1%5D%0Afa%5B0%5D.append(jobb_ag)%0A%0Aprint+fa&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=2&rawInputLstJSON=%5B%5D&curInstr=0 link]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">Itt látható hogy a belsőbb listák a ''fa'' nevű listán kereszül érhetőek el, és azokat is meg kell tartani szemétgyűjtéskor, hiába nincs olyan változó, ami közvetlenül rájuk mutat.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">Miután elvégezte a válogatást, felszabadítja a </ins>nem <ins class="diffchange diffchange-inline">szükséges memóriablokkokat, és bizonyos esetekben a megtartott, szükséges blokkokat átrendezi úgy, hogy azok hatékonyabban foglalják a helyet</ins>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Összehasonlítás ===</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Összehasonlítás ===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Mint láthatjuk a manuális memóriakezelés nem egyszerű, mindjárt nézünk néhány tipikus hibát is majd, amit könnyű vele elkövetni. Sokkal nehezebb használni, de mit nyerünk vele, miért használják mégis még mindig a C-t mint programozási nyelv? A válasz, mint a C-nél általában, az, hogy hatékonyságot.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Mint láthatjuk a manuális memóriakezelés nem egyszerű, mindjárt nézünk néhány tipikus hibát is majd, amit könnyű vele elkövetni. Sokkal nehezebb használni, de mit nyerünk vele, miért használják mégis még mindig a C-t mint programozási nyelv? A válasz, mint a C-nél általában, az, hogy hatékonyságot.</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">A python szemétgyűjtője ugyan felszabadítja idővel a fölösleges memóriát, de tényleg csak idővel, így a program folyamatosan több memóriát használ mint feltétlenül szükséges. (Plusz, eleve az automatikus memóriakezelés megvalósításához plusz memóriára van szükség az interpreterben, mielőtt a mi programunk akár elindult volna.) Aztán, amikor lefut a ''szemét gyűjtés'', az bizonytalan hogy mennyi ideig tart, és kb. bármikor lefuthat. Így ha a programunknak azonnal kell tudnia reagálni, akkor megengedhetetlen hogy közben lefusson egy szemétgyűjtés, python-ban viszont ezt nem lehet megakadályozni.</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Ezek mind olyan problémák, amik a legtöbb programozó számára nem számítanak. Ellenben a C problémáival, amivel mindenki szembesül aki használni próbálja. Ezért is mondtam az első C előadáson, hogy valószínűleg nem fog nektek a C kelleni a jövőben, csak a nagyon erőforrásigényes és/vagy sebesség igényes alkalmazásokhoz használják. De azért néhány tanulság levonható a most tanultakból, ami automatikus memóriakezelés esetén is érvényes.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Ezek mind olyan problémák, amik a legtöbb programozó számára nem számítanak. Ellenben a C problémáival, amivel mindenki szembesül aki használni próbálja. Ezért is mondtam az első C előadáson, hogy valószínűleg nem fog nektek a C kelleni a jövőben, csak a nagyon erőforrásigényes és/vagy sebesség igényes alkalmazásokhoz használják. De azért néhány tanulság levonható a most tanultakból, ami automatikus memóriakezelés esetén is érvényes.</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">== Memóriakezelési hibák ==</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Most megvizsgálunk néhány tipikus problémát, amit a memóriakezelés folyamán el lehet követni.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">=== Memóriaszívárgás (memory leak) felejtéssel ===</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Memóriaszívárgásról általánosságban akkor beszélünk, ha a program nem szabadítja fel a memóriát amire már nincsen szüksége, főleg ha közben egyre több memóriát foglal le fölöslegesen.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">A legegyszerűbb ezt úgy elkövetni ha "elfelejtjük" a lefoglalt memória címét, olyan változóban tároltuk el, ami megsemmisül:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"><c></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">void szivargo() {</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    int *tomb = malloc(10 * sizeof(int));</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    // ....</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    if(valami_furcsa_tortent) {</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">        // Elobb kilepunk a fuggvenybol</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">        return;</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    }</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    // ....</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    free(tomb);</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">}</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></c></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Ebben az esetben például hiába szabadítjuk fel a függvény végén a lefoglalt memóriát, elófordulhat olyan eset, amikor a függvény előbb kilép. Ilyenkor a ''tomb'' számára lefoglalt memória nem csak hogy nem lesz felszabadítva, de el is veszítettük a rá mutató mutatót, úgyhogy nem is tudjuk többé felszabadítani. Tehát mindig amikor ez a függvény meg van hívva és valami furcsa történik, lefoglalunk 40 byte memóriát amit soha nem szabadítunk fel. Ha ez a függvény egy órákon át futó szerver része, és a hosszú órák alatt 400000-szer megtörténik a furcsa dolog, akkor már ez az egy függvény 40 MB memóriát foglalt amit nem lehet felszabadítani, 40 MB memória elszívárgott.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Rövid ideig futó programoknál ez nem olyan nagy tragédia: amikor a program futása végetér, az operációs rendszer minden memóriát amit az a program foglalt le, felszabadít, tehát ha a programon belül nem is volt már lehetőség felszabadítani, ennek nincs hatása a számítógép további futására.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">=== Memóriszívárgás megtartással ===</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">A memóriaszivárgás másik változata olyan, hogy akár python-ban, és bármelyik szemét gyűjtéssel működő nyelvben is el lehet követni. Arról van szó, ha valamit eltárolunk egy változóban, pedig már nem lesz rá szükségünk. Nézzük a következő python példát:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Van egy függvényünk, ''beolvas(fajlnev)'', ami adatokat olvas be egy fájlból, azonban a fájl bonyolult szisztémája miatt ez sokáig tart. Valahogy így kell használni a függvényt:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"><python></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">while true:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    fajlnev = raw_input("Melyik fajlt dolgozzam fel?")</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    adatok = beolvas(fajlnev)</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    feldolgoz(adatok)</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></python></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Ez a program nagyon sokáig futhat, és újabb és újabb fájlokat dolgozhat fel. Mivel a fájl beolvasása már maga lassú, és időnként előfordul hogy ugyanazt a fájlt kétszer fel kell dolgozni (és a feldolgozandó fájlok tartalma nem változik), az egyik programozó úgy dönt, hogy gyorsít a dolgon azzal, hogy letárolja a már beolvasott fájloknál a bennük levő adatokat.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"><python></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">tarolt_adat = {}</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">while true:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    fajlnev = raw_input("Melyik fajlt dolgozzam fel?")</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    if fajlnev in tarolt_adat:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">        feldolgoz(tarolt_adat[fajlnev])</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">    else:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">        adatok = beolvas(fajlnev)</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">        tarolt_adat[fajlnev] = adatok</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">        feldolgoz(adatok)</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></python></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Ezzel a megoldással nincsen technikai probléma, működik, és eleinte valószínűleg gyorsabb is mint az eredeti megoldás. Azonban, azzal hogy ezeket a beolvasott adatokat a végtelenségig eltárolja, egyre több memóriát foglal, annak ellenére, hogy a fájlok többségét nem kell többször feldolgozni. Ha gyorsítani akarunk, akkor ahhoz érdemesebb lenne valami bonyolultabb megoldást alkotni, ami mondjuk egy óra után elfelejti a beolvasott fájlokat, vagy maximum 10 fájl adatait tárolja le, mert ez így nem fenntartható viselkedés.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">=== Felszabadított memória használata ===</ins></div></td></tr>
</table>Csirkehttp://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10707&oldid=prevCsirke, 2015. április 29., 09:27-n2015-04-29T09:27:34Z<p></p>
<a href="http://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10707&oldid=10706">Változtatások megtekintése</a>Csirkehttp://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10706&oldid=prevCsirke: Informatika2-2015/Eloadas 11 C-5 Memoria kezeles lapot átneveztem Informatika2-2015/Eloadas 12 C-5 Memoria kezeles névre2015-04-29T09:27:02Z<p><a href="/edit/Informatika2-2015/Eloadas_11_C-5_Memoria_kezeles?redlink=1" class="new" title="Informatika2-2015/Eloadas 11 C-5 Memoria kezeles (a lap nem létezik)">Informatika2-2015/Eloadas 11 C-5 Memoria kezeles</a> lapot átneveztem <a href="/view/Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles" title="Informatika2-2015/Eloadas 12 C-5 Memoria kezeles">Informatika2-2015/Eloadas 12 C-5 Memoria kezeles</a> névre</p>
<table class='diff diff-contentalign-left'>
<tr valign='top'>
<td colspan='1' style="background-color: white; color:black;">←Régebbi változat</td>
<td colspan='1' style="background-color: white; color:black;">A lap 2015. április 29., 09:27-kori változata</td>
</tr></table>Csirkehttp://wiki.math.bme.hu/index.php?title=Informatika2-2015/Eloadas_12_C-5_Memoria_kezeles&diff=10705&oldid=prevCsirke: Új oldal, tartalma: „= Memória kezelés = A programozási nyelveknek alapvetően két fajta hozzáállása lehet a memória kezeléséhez, automatikus vagy manuális. A ma is elterjedt pr…”2015-04-28T23:48:14Z<p>Új oldal, tartalma: „= Memória kezelés = A programozási nyelveknek alapvetően két fajta hozzáállása lehet a memória kezeléséhez, automatikus vagy manuális. A ma is elterjedt pr…”</p>
<p><b>Új lap</b></p><div>= Memória kezelés =<br />
<br />
A programozási nyelveknek alapvetően két fajta hozzáállása lehet a memória kezeléséhez, automatikus vagy manuális. A ma is elterjedt programozási nyelvek közül csak a C és a C++ az ami még manuális memóriakezelést használ. A mai előadáson megnézzük hogy ez pontosan mit jelent. Ez azért is tanulságos lesz, hogy jobban megértsük hogy működnek azok a nyelvek amik automatikus memória kezelést használnak.<br />
<br />
== Mit is értünk memória kezelés alatt ==<br />
<br />
Először nézzünk egy python példát:<br />
<br />
<python><br />
# Ez egy lista objektum:<br />
lista1 = [1, 2, 3]<br />
# Ez az objektum valahol letezik a memoriaban,<br />
# es a "lista1" valtozo hivatkozik ra.<br />
<br />
# Ha ezt csinalom akkor mar ket valtozo hivatkozik ra:<br />
lista2 = lista1<br />
<br />
# Ha ezt, akkor megint csak egy:<br />
lista1 = []<br />
<br />
# Ha ezt csinalom akkor mar egy valtozo sem hivatkozik ra:<br />
lista2 = []<br />
# Akkor vajon letezik meg az a lista?<br />
# Elerni mar nem tudom egyik valtozon keresztul se.<br />
</python><br />
<br />
A válasz a kód végén feltett kérdésre az, hogy nem tudjuk. Mivel nem elérhető az a lista sehogyan sem, ezért a program helyes futása szempontjából mindegy hogy még létezik-e az a lista, hiszen már soha nem tudjuk használni semmire. Azonban abból a szempontból fontos hogy létezik-e, hogy ha még létezik, akkor a memóriának az a része ahol ez a lista található, nem használható másra.<br />
<br />
Mivel a python egy olyan nyelv, ami automatikus memóriakezelést tartalmaz, ezért ott a felhasználónak nem kell törődnie ezzel a problémával, a python interpreter biztosít minket hogy minden amire már nincs szükség az idővel megsemmisül, és a soha nem fog a program túl sok fölösleges memóriát használni. Majd az előadás későbbi részében visszatérünk rá, hogy ezt pontosan hogyan csinálja.<br />
<br />
Azonban a példa mutatja, hogy a program számára a memória is egy ''erőforrás'', amit kezelni kell. Amikor létrehozok egy objektumot vagy bármilyen változót, akkor annak '''lefoglalok/allokálok''' valamennyi memóriát. Ezt a részt a memóriában '''fel kell szabadítani''' mielőtt lefoglalhatom valamilyen más célra.<br />
<br />
== C memóriakezelés ==<br />
<br />
=== C verem ===<br />
<br />
A C memóriakezelésének egy részével már találkoztunk. Amikor két előadással ezelőtt arról beszéltem, hogy mi egy változó élettartalma, akkor az egyfajta memóriakezelés. Mindig amikor elkezdődik egy blokk a kódban, akkor a C program ''lefoglalja'' a szükséges memóriát az abban levő változóknak, és amikor vége a blokknak, akkor ''felszabadítja'' ezt a memóriát.<br />
<br />
Mivel a blokkok szigorúan tartalmazzák egymást (nem lehet részleges átfedés két blokk között), ezért ha egy blokk éppen fut amig egy másik blokk kezdődik, akkor a másik blokknak lesz előbb vége. Ez azt jelenti, hogy ha lefoglaltam már az éppen futó X blokkhoz X memóriát, és most lefoglalok Y blokkhoz Y memóriát, akkor biztos az Y-t kell előbb felszabadítanom mint az X-et.<br />
<br />
Emiatt ezeket a memóriablokkokat tárolhatom egymás "tetején", az X tetejére tehetem az Y-t, hisz az Y-t biztos előbb kell eldobnom mint az X-et. A memóriának azt a részét, ahol a C program a blokkok memóriáját így, egymás tetején, tárolja, úgy hívják hogy '''verem''' (angolul ''stack'').<br />
<br />
Itt látható egy ábra az angol wikipédiáról, hogy hogy néz ki ez a verem. Itt a DrawSquare függvény meghívta a DrawLine függvényt, és amíg a DrawLine függvény fut, addig a DrawLine függvény paraméterei és belső (lokális) változói le vannak tárolva a verem tetején. Mivel a DrawSquare biztosan nem tud véget érni amig a DrawLine még fut, ezért nem baj hogy lejjebb van a veremben és még nem felszabadítható.<br />
<br />
[[Fájl:Call stack layout.png]]<br />
<br />
Ahhoz hogy ez így megtehető legyen, ahhoz az is kell egyébként, hogy a C-ben minden típusnak fix a mérete. Ezért le tudok foglalni egy memóriablokkot a DrawSquare-nek, a tetejére tehetek egy másik memóriablokkot, és nem kell aggódnom amiatt, hogy hirtelen nagyobb hely fog kelleni valamelyik változónak a DrawSquare-ben. (Ezért van, hogy a tömbök is fix méretűek ellenben a python-os listával ellentétben, és ilyen kevés fajta típus van.)</div>Csirke