A C ++ esetén mi a különbség a * * temp és a * * = az új csomópont deklarációk között, ahol a csomópont egy olyan struktúra, amely 2 elem adatait tartalmazza, majd a következőt?


Válasz 1:

Feltételezem, hogy ez a két deklaráció helyi vagy statikus változókra vonatkozik. Az első csak egy „temp” nevű változót deklarál, amelynek típusa „pointer to node”, de nem inicializálja. A második ugyanazt a változót deklarálja, de egy mutatóval inicializálja azt a csomóponthoz rendelt csomópont-struktúrához.

Mindig ajánlatos a változókat inicializálni, mint nem inicializálni. Még akkor is, ha a változót valahol máshol a kódba állítja, akkor a legjobb, ha a deklarációban legalább null értékre állítja (csomópont * temp = nullptr), mivel ez megkönnyíti a hibakeresést.


Válasz 2:

csomópont * temp; inicializálja a mutatót a csomóponthoz. Lehet, hogy később hozzárendel egy csomópont címét. Ennek a csomópontnak már léteznie kellene. Megengedheti, hogy a mutató kikerüljön a hatókörétől, anélkül, hogy szivárogna a csomópont, mert egyértelműen külön létezik a mutatótól.

csomópont * temp = új csomópont; memóriát foglal le, és felhívja a konstruktort egy új csomópont-objektum inicializálására. Az egyetlen hivatkozás arra a csomópontra a mutató. Ha az egérmutató hatókörén kívül esik, akkor a csomópont szivárog, azaz még létezik, továbbra is memóriát foglal el, de semmilyen módon nem érhető el. Mielőtt a mutató kialszik a hatókörről, törölje azt a csomópontot, amelyre mutat, hogy elkerülje azt.

Következő téma: intelligens mutatók. A C ++ 11 vagy annál magasabb nyelven vannak ezek. Előtte elég könnyű volt saját gurulni. Az intelligens mutató egy osztály tárgya, konstruktorral és pusztítóval. Amikor az intelligens mutató elhagyja a hatókört, annak pusztítóját meghívják, és a pusztító törli azt a dolgot, amely a mutató tulajdonában van. Az intelligens mutatók megakadályozzák a szivárgásokat, még akkor is, ha egy kód kivételével kivonul, mert kivétel történt.