C kezdőknek

C ++ kezdőknek

2.2. Dinamikus memóriaelosztás és mutatók

Mielőtt objektum-orientált fejlesztésbe megyünk, kicsit ki kell emelnünk a C ++ programban a memóriával való együttműködést. Nem tudunk összetett programokat írni, nem tudjuk, hogyan kell a memóriát futtatni a futásidőben és elérni.
C ++ esetén az objektumok statikusan - fordítási időben vagy dinamikusan - a programfuttatás alatt helyezhetők el, a normál könyvtár funkcióinak hívásával. A legfontosabb különbség ezeknek a módszereknek a felhasználása azok hatékonysága és rugalmassága. A statikus elhelyezés hatékonyabb, mivel a memóriaelosztás a program végrehajtása előtt történik, de sokkal kevésbé rugalmas, mert előzetesen meg kell tudnunk a behelyezett tárgy típusát és méretét. Például, egyáltalán nem könnyű egy szöveges fájl tartalmát egy statikus karakterláncba helyezni: előre meg kell ismerni a méretét. Az olyan feladatok, amelyekben korábban ismeretlen elemek számát kell tárolni és feldolgozni, általában szükség van a memória dinamikus elosztására.
Eddig minden példánkban statikus memóriaelosztást használtunk. Mondjuk az ival változó meghatározását

Ez a kifejezés pontosan ugyanazt a műveletet eredményezi, mint a

Ebben a példában nincs valós értelme: a mutató használata az ival változó közvetett manipulálására kevésbé hatékony és kevésbé nyilvánvaló. Ezt a példát csak azért adtuk meg, hogy a mutatók első ötlete legyen. A valóságban a mutatókat leggyakrabban a dinamikusan elhelyezett objektumok manipulálására használják.
A statikus és a dinamikus memóriaelosztás fő különbségei a következők:

  • a statikus objektumokat megnevezett változók jelölik, és ezeken az objektumokon végrehajtott műveletek közvetlenül, nevük felhasználásával történik. A dinamikus objektumok nem rendelkeznek saját nevekkel, és a cselekvések a közvetett módon történik, mutatók használatával;
  • az összeállítás automatikusan kiosztja és törli a memóriát a statikus objektumok számára. A programozónak nem kell saját maga gondoskodnia. A dinamikus objektumok memóriájának elosztása és felszabadítása teljes mértékben a programozó felelőssége. Ez meglehetõsen nehéz feladat, amikor könnyû hibákat megoldani. A dinamikusan hozzárendelt memória manipulálásához az új és a törlési operátorokat használják.

Az új üzemeltetőnek két formája van. Az első forma egy bizonyos típusú objektumhoz rendeli a memóriát:

Ebben a példában a memóriát négyféle típusú int típusú tömbhöz rendeltük el. Sajnos az új operátor ilyen formája nem teszi lehetővé a tömb elemeinek inicializálását.
Bizonyos zavart okoz az a tény, hogy az üzemeltető mindkét formája ugyanazt a mutatót adja vissza, példánkban pedig mutató egész számra. Mind a pint, mind a pia pontosan ugyanazt jelentik, de a pint egyetlen int típusú objektumra mutat, és pia négy típusú négy típusú objektum első elemére utal.
Ha egy dinamikus objektumra nincs szükség, akkor kifejezetten fel kell szabadítani a hozzárendelt memóriát. Ezt a törlési operátor segítségével végezzük, amely két új formához hasonlóan - egy objektumhoz és egy tömbhöz:

Mi történik, ha elfelejtjük elengedni az elosztott memóriát? A memória elpazarolódik, nem fogja használni, de nem visszakerül a rendszerbe, mivel nincs mutatónk. Ez a jelenség különleges név memória szivárgást kapott. Végül a program összeomlik a memória hiánya miatt (ha persze elég hosszú lesz). Egy kis szivárgást nehéz észlelni, de vannak olyan segédprogramok, amelyek segítik ezt.
A memória dinamikus elosztásának és a mutatók használatának rövid áttekintése valószínűleg több kérdést hozott fel, mint a válaszokat. A 8.4 fejezetben a felvetett kérdéseket részletesen ismertetni fogják. Ezt a visszavonulást azonban nem tehettük meg, hiszen az Array osztály, amelyet a következő szakaszokban tervezünk, a dinamikusan elkülönített memória használatán alapul.

2.3. Gyakorlat

Magyarázza el a négy objektum közötti különbséget:

2.4 gyakorlat.

Mi a következő kódfájl? Mi a logikai hiba? (Vegye figyelembe, hogy az index felvételének művelete ([]) helyesen került a pia mutatóra, ennek magyarázatát a 3.9.2. Szakasz tartalmazza.)

Kapcsolódó cikkek