Ha a dinamikus memóriában létrehozott tömb összes elemét törlöm akkor az hogyan lehet, hogy a törölt objektumnak az adattagjait el tudom érni? C++.
//main.cpp
# include <iostream>
typedef unsigned short ushort ;
using std::cout ;
using std::endl ;
class cCat {
public:
cCat(ushort = 0,float = 0.5) ;
~cCat(void) { cout << "cCat destructor \n" ; }
void i_setAge(ushort age) { this->i_age = age ; }
ushort i_getAge()const { return ushort (this->i_age) ; }
void i_setWeight(float weight) { this->i_weight = i_weight ; }
float i_getWeight(void)const { return float (this->i_weight) ; }
private:
ushort i_age ;
float i_weight ; };
cCat::cCat(ushort age, float weight): i_age(age), i_weight(weight) { cout << "cCat constructor \n" ; }
int main(void) {
cCat *p_myArray = new cCat[11] ; //Létrehozza a konstruktor.
cCat *p_CatOne = p_myArray ; /*A tömb első elemének címét hozzárendelem egy mutatóhoz.*/
p_CatOne+= 2 ; /*Ezt sem értem hogy ez valójában miért lehetséges egy mutatóval.Egy csak egy mutató ami egy objektum címét tárolja mi köze van a többihez?Semmi akkor meg,hogy lehet csak úgy ugrani egy másik objektum címére. */
delete [] p_myArray ; //Törlöm az egész tömböt.
p_CatOne->i_setAge(8) ; /*Mivel töröltem az előbb ezért most a p_CatOne egy nemlétező objektumra mutat és mégis eltudom érni azt a törölt nemlétező objektumot.Ez hihetetlen hát hogy van ez?*/
cout << p_CatOne->i_getAge() ; /*Az összes objektum törölve lett és van i_age adattagja és i_getAge metódusa hihetetlen. */
return 0 ; }
"Ezt sem értem hogy ez valójában miért lehetséges egy mutatóval"
A mutatóaritmetika arra a feltételezésre épül, hogy egy tömbelemre mutatsz. A te felelősséged, hogy valóban így legyen.
"Mivel töröltem az előbb ezért most a p_CatOne egy nemlétező objektumra mutat és mégis eltudom érni azt a törölt nemlétező objektumot.Ez hihetetlen hát hogy van ez?"
Amit csinálsz, úgy hívják, hogy undefined behavior. Működhet, de csinálhat bármi mást is (pl formázza a vinyód, ha vicceskedvű volt a fordítóprogram írója).
A runtime lefoglalja a memóriát, és amikor delete-t hívsz rá, felírja, hogy igen, ez a memóriaterület szabad, de nem adta vissza az oprendszernek. Tehát nyugodtan garázdálkodhatsz benne, C++-ban senki nem fogja ellenőrizni, hogy egy adott mutató érvényes objektumra mutat-e.
Értem köszi adtam zöld kezet.
És a mutatótömböknél,hogy van ez ott is a mutatótömb neve mutat arra a címre ami a mutatótömb első eleme?
Ott valahogy nem akar működni a mutatóaritmetika.
Pedig azok is tömb elemek.
"És a mutatótömböknél,hogy van ez ott is a mutatótömb neve mutat arra a címre ami a mutatótömb első eleme?"
A tömb neve a tömböt jelenti. Viszont konvertálódik automatikusan és kussban az első elemre mutató mutatóvá, szóval igen, a tömb neve az első elem címét reprezentálja.
Mutass példát, hogy szerinted mi nem működik, mert a mutatótömbök is tökéletesen úgy viselkednek, mint akármelyik másik.
int x = 5, y = 4 ;
int *myArray[2] = { &x, &y } ;
int **myArit = myArray ;
std::cout << *myArray << std::endl ; //Ez mutat a mutatótömb első elemére ami egy memóriacím igaz?
std::cout << myArray << std::endl ; //Ez mire mutat akkor?
"std::cout << *myArray << std::endl ; //Ez mutat a mutatótömb első elemére ami egy memóriacím igaz? "
Nem, mint említettem, a tömbnév az első elemre mutató mutatóvá alakul. Tehát a myArray (a tömbnév) az első elemre mutató mutatóként viselkedik. A *myArray az a mutató dereferálása, tehát az a tömb első eleme.
"std::cout << *myArray << std::endl ; //Ez mutat a mutatótömb első elemére ami egy memóriacím igaz?"
Igen, de nullától kezdődik a sorszámozás, a nulladik elemére mutat,a nulladik a legelső elem.
"std::cout << myArray << std::endl ; //Ez mire mutat akkor?"
A myArray mutató címére mutat.
"Nem, mint említettem, a tömbnév az első elemre mutató mutatóvá alakul. Tehát a myArray (a tömbnév) az első elemre mutató mutatóként viselkedik. A *myArray az a mutató dereferálása, tehát az a tömb első eleme."
Dehát a "std::cout << *myArray << std::endl ;" és a "std::cout << myArray[0] << std::endl ;" tulajdonképpen eqvivalens ebben az esetben.
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!