Mikor van szükség arra, hogy egy objektumot mutatóval hozzak létre?
például:
const CAT *const Bolyhos = new CAT;
Tudom,hogy hogyan működik ez amit írtam csak mikor fogom én ezt használni milyen feladat van ami szükségessé teszi azt,hogy így hozzak létre egy objektumot?
Értem akkor csak ezért,de akkor igenagynak kellene lennie annak a programnak.
Biztos csak ez okból használják ezeket?
Ha írok egy kisebb programot amiben sok nagyobb méretű tömb van és egy csomó változó akkor ezek közül milyen helyzetben levő változókat és tömböket érdemes dinamikusan használni?
Miért lassítaná a változók a programomat?
Szerintem ez butaság amit írtál.
Épp az hogy inkább a változók szabadulnak meg mert ha egy függvény visszatér a hívóhoz akkor a benne levő változók felszabadulnak nem?
Inkább a dinamikusan létrehozott dolgok okozhatnak memóriagondokat ha nem szabadítjuk fel őket.
Akkor most mikor használjam a mutatókat és a hivatkozásokat és mikor helyezzek valamit a dinamikus memóriába?
Egy egyszerű példa.
Tömböt akarsz használni, a bemenő adatok tárolására, de nem tudod mennyi adat lesz.
Ha simán foglalsz egy 10 elemű tömböt, akkor lehet túl sok fölösleg lesz (pocsékolás, ha csak 1-2 elem van), vagy túl kevés (ha már 11-12 elem van.)
Ezt "csak úgy" tömbbökkel nem lehet megoldani.
Ekkor jönnek a pointerek.
Ezek csak egy memória címet adnak meg.
Amikor több hely kell, csak allokálsz még tömbb memóriát. (Hozzáadsz +1, +2, stb... elemnyi helyet.)
Máris itt egy dinamikus tömb, ami akkora lehet akár, mint a teljes memória, de mégis kevés adat esetén nem foglal több helyet, mint kéne.
Tegyük fel, hogy kell írnod egy programot, aminek akár egymilliárd elemmel is képesnek kell lennie dolgozni, de az idő 99%-ában max. 10 elem lesz benne.
Statikus megoldás: egymilliárd elemű tömb. Ha ezek mondjuk longintek, akkor ez kb. 4 GB memóriát használ majd, bármit teszel is. A gépnek sokkal kevesebb szabad memóriája lesz -> jelentősen lassul.
Dinamikus megoldás: annyi elemed van a memóriában, amennyi kell (pl. láncolt listában). Az idő 99%-ában 10 elemet tárolsz, ez 40 bájtot jelent. Ha viszont több adatra van szükség, megnő a lefoglalt memória, de csak addig, amíg kell. Nyilván oda kell figyelni, hogy felszabadítsd, ami nem kell, de ez sokkal hatékonyabb megoldás.
A példa nyilván sarkított egy kicsit, de remélem, látható, amit mondani akarok.
Az egy dolog, hogy memóriahasználat. A példa is elég ostoba. Akkor van szükség dinamikus memóriára, amikor
1) nem tudod előre, mennyi memóriára van szükség
2) azt akarod, hogy az objektum amit létrehozol túlélje a létrehozás környezetét. Pl ha egy függvényből egy nagy objektumot akarsz visszaadni, amit nem akarsz másolgatni (pl mert nagy, vagy nem másolható, mint pl az iostreamek), akkor létrehozod a dinamikus memóriában, és visszadod a mutatót rá. Persze ekkor figyelni kell rá, hogy valamikor fel is szabaduljon, ezért érdemes egyből egy smart pointert visszaadni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!